为什么这样连合法方案都搜不到啊/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 sum,int num,vector<int>a[]) {
if(sum==n*n) {
ans=max(ans,num);
return;
}
int tot[10][10],can[10][10][10],Cnt=0;
node x[105];
bool 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(!a[i][j]&&!tot[i][j])return;
if(tot[i][j]==1)a[i][j]=can[i][j][1],flag=1,sum++,num+=query(i,j)*can[i][j][1];
if(!flag) {
x[++Cnt].x=i;
x[Cnt].y=j;
x[Cnt].tot=tot[i][j];
}
}
}
sort(x+1,x+Cnt+1,cmp);
for(int i=1; i<=Cnt; i++) {
for(int j=1; j<=tot[x[i].x][x[i].y]; j++) {
num+=query(x[i].x,x[i].y)*can[x[i].x][x[i].y][j];
a[x[i].x][x[i].y]=can[x[i].x][x[i].y][j];
dfs(sum+1,num,a);
num-=query(x[i].x,x[i].y)*can[x[i].x][x[i].y][j];
a[x[i].x][x[i].y]=0;
}
}
}
int main() {
int cnt=0,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);
cnt+=(a[i][j]!=0),num+=query(i,j)*a[i][j];
}
}
dfs(cnt,num,a);
if(ans)cout<<ans<<endl;
else cout<<-1<<endl;
}