世界上最好理解的代码!!!
#include<bits/stdc++.h>
using namespace std;
int a[5][5];
bool vis[20];
bool check(){
for(int i=1;i<=4;i++){
int s=34;
for(int j=1;j<4;j++) s-=a[j][i];
if(s<=0||s>16||vis[s]) return 0;
a[4][i]=s;
vis[s]=1;
}
vis[a[4][1]]=vis[a[4][2]]=vis[a[4][3]]=vis[a[4][4]]=0;
if(a[1][1]+a[1][4]+a[4][1]+a[4][4]==34&&a[1][3]+a[1][4]+a[2][3]+a[2][4]==34&&a[3][1]+a[3][2]+a[4][1]+a[4][2]==34&&a[3][3]+a[3][4]+a[4][3]+a[4][4]==34&&a[1][1]+a[2][2]+a[3][3]+a[4][4]==34&&a[1][4]+a[2][3]+a[3][2]+a[4][1]==34) return 1;
return 0;
}
void print(){
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++) printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
}
void dfs(int x,int y){
if(x==4){
if(check()) print();
return;
}
if(y==4){
a[x][y]=34-a[x][y-1]-a[x][y-2]-a[x][y-3];
if(a[x][y]<=0||a[x][y]>16||vis[a[x][y]]) return;
vis[a[x][y]]=1;
dfs(x+1,1);
vis[a[x][y]]=0;
}else{
if(x==2&&y==2){
a[x][y]=34-a[x-1][y-1]-a[x-1][y]-a[x][y-1];
if(a[x][y]<=0||a[x][y]>16||vis[a[x][y]]) return;
vis[a[x][y]]=1;
dfs(x,y+1);
vis[a[x][y]]=0;
}else{
for(int i=1;i<=16;i++){
if(!vis[i]){
vis[i]=1;
a[x][y]=i;
dfs(x,y+1);
vis[i]=0;
}
}
}
}
}
int main(){
dfs(1,1);
return 0;
}