第52行报错
#include<bits/stdc++.h>
using namespace std;
const int N=9;
int ones[1<<N],map[1<<N];
int row[N],col[N],cell[3][3];
int g[N][N];
int ans=-1;
int lowbit(int x){
return x&-x;
}
void init(){
for(int i=0;i<N;i++){
row[i]=col[i]=(1<<N)-1;
}
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cell[i][j]=(1<<N)-1;
}
}
}
int get_score(int x,int y){
return min(min(x,8-x),min(y,8-y))+6;
}
int get(int x,int y){
return row[x]&col[y]&cell[x/3][y/3];
}
bool dfs(int cnt,int score){
if(!cnt){
ans=max(ans,score);
return false;
}
int minv=10;
int x,y;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(!g[i][j]){
int t=ones[get(i,j)];
if(t<minv){
minv=t;
x=i,y=j;
}
}
}
}
for(int i=get(x,y);i;i-=lowbit(i)){
int t=map[lowbit(i)];
row[x]-=1<<t;
col[y]-=1<<t;
cell[x/3][y/3]-=1<<t;
g[x][y]=t+1;
if(dfs(cnt-1,score+get_score(x,y)*(t+1)))
return true;
row[x]+=1<<t;
col[y]+=1<<t;
cell[x/3][y/3]+=1<<t;
g[x][y]=0;
}
return false;
}
int main(){
for(int i=0;i<N;i++){
map[1<<i]=i;
}
for(int i=0;i<1<<N;i++){
int s=0;
for(int j=1;j;j-=lowbit(j))
s++;
ones[i]=s;
}
init();
int cnt=0,score=0;
for(int i=0,k=0;i<N;i++){
for(int j=0;j<N;j++){
int x;
cin>>x;
g[i][j]=x;
if(x){
row[i]-=1<<(x-1);
col[j]-=1<<(x-1);
cell[i/3][j/3]-=1<<(x-1);
score+=get_score(i,j)*x;
}
else{
cnt++;
}
}
}
dfs(cnt,score);
cout<<ans;
return 0;
}