答案是: 12
16 3 2 13
5 10 11 8
9 6 7 12
4 15 14 1
C 代码:
#include
#include
int check(int**chess,int row,int col){
int sum=0,t,r;
for(int i=0;isum+=chess[i][0];
}
t=0;
for(int i=0;it+=chess[i][i];
}
if(t!=sum) return 0;
t=0;
for(int i=col-1;i>=0;i--){
t+=chess[abs(i-col+1)%col][i];
}
if(t!=sum) return 0;
for(int i=0;it=0;
for(int j=0;jt+=chess[j][i];
}
if(sum!=t) return 0;
}
for(int i=0;it=0;
for(int j=0;jt+=chess[i][j];
}
if(sum!=t) return 0;
}
return 1;
}
int doChess(int **chess,int row,int col,int x,int y){
if(y>=col){
y=0;
x++;
if(x>=row){
return check(chess,row,col);
}
return doChess(chess,row,col,x,y);
}else{
if(chess[x][y]){
y++;
return doChess(chess,row,col,x,y);
}else{
int* vs=(int *)malloc(sizeof(int)*(row*col));
int len=0;
for(int i=0;ifor(int j=0;j
if(chess[i][j])vs[len++]=chess[i][j];
}
}
if(len==row*col)
return check(chess,row,col);
int flag=0;
for(int i=1;i<=row*col;i++){
flag=1;
for (int j=0;jif(vs[j]==i){
flag=0;
break;
}
}
if(flag){
chess[x][y]=i;
if(doChess(chess,row,col,x,y+1))
return 1;
}
}
chess[x][y]=0;
return 0;
}
}
}
int main(void){
int **chess;
int row,col;
scanf("%d %d",&row,&col);
chess=(int**)(malloc(sizeof(int *)*row));
for(int i=0;ichess[i]=(int*)malloc(sizeof(int)*col);
for(int j=0;jscanf("%d",chess[i]+j);
}
}
for(int i=0;ifor(int j=0;j
printf("%3d",chess[i][j]);
}
printf("\n");
}
int r=doChess(chess,row,col,0,0);
if(r){
for(int i=0;ifor(int j=0;j
printf("%3d",chess[i][j]);
}
printf("\n");
}
}
return 0;
}
? 前八十回