为什么改变X数组的顺序会影响结果啊/yiw
#include<bits/stdc++.h>
using namespace std;
int n=9,ans;
int query(int i,int j) {
if(i==1||i==9||j==1||j==9)return 6;
if(i==2||i==8||j==2||j==8)return 7;
if(i==3||i==7||j==3||j==7)return 8;
if(i==4||i==6||j==4||j==6)return 9;
return 10;
}
bool check(int x,int y,int k,vector<int>a[]) {
for(int i=1; i<=n; i++)if(a[x][i]==k)return 0;
for(int i=1; i<=n; i++)if(a[i][y]==k)return 0;
for(int i=3*((x-1)/3)+1; i<=3*((x-1)/3)+3; i++)
for(int j=3*((y-1)/3)+1; j<=3*((y-1)/3)+3; j++)if(a[i][j]==k)return 0;
return 1;
}
struct node {
int x,y,tot;
};
bool cmp(node u,node v) {
return u.tot<v.tot;
}
void dfs(int num,vector<int>a[]) {
bool flag=1;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)flag&=(a[i][j]!=0);
if(flag) {
ans=max(ans,num);
return;
}
int tot[10][10],_can[10][10][10],Cnt;
node X[1005];
flag=1;
while(flag) {
flag=0;
Cnt=0,memset(tot,0,sizeof(tot));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(a[i][j])continue;
for(int k=1; k<=n; k++)if(check(i,j,k,a))_can[i][j][++tot[i][j]]=k;
if(!tot[i][j])return;
if(tot[i][j]==1)a[i][j]=_can[i][j][1],flag=1,num+=query(i,j)*_can[i][j][1];
}
}
Cnt=0,memset(tot,0,sizeof(tot));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(a[i][j])continue;
for(int k=1; k<=n; k++)if(check(i,j,k,a))_can[i][j][++tot[i][j]]=k;
if(!tot[i][j])return;
Cnt++;
X[Cnt].x=i;
X[Cnt].y=j;
X[Cnt].tot=tot[i][j];
}
if(!Cnt) {
ans=max(ans,num);
return;
}
//random_shuffle(X+1,X+Cnt+1); 就在这里
//sort(x+1,x+Cnt+1,cmp);
for(int i=1; i<=Cnt; i++) {
for(int j=1; j<=X[i].tot; j++) {
a[X[i].x][X[i].y]=_can[X[i].x][X[i].y][j];
dfs(num+query(X[i].x,X[i].y)*_can[X[i].x][X[i].y][j],a);
a[X[i].x][X[i].y]=0;
}
}
}
int main() {
int num=0;
vector<int>a[10];
for(int i=1; i<=n; i++) {
int temp;
a[i].push_back(0);
for(int j=1; j<=n; j++) {
cin>>temp;
a[i].push_back(temp);
num+=query(i,j)*temp;
}
}
dfs(num,a);
if(ans)cout<<ans<<endl;
else cout<<-1<<endl;
}