题目
自己读题
样例
显然,样例正确!
九宫格每一行,每一列,对角线之和都为15
C++ 代码
#include <iostream>
#include <cstring>
using namespace std;
int g[5][5];
int ans[5][5];
bool st[10];
int res=0;//res记录可行解
void dfs(int x,int y){
if(y>3){
x++;
y=1;
}
if(x>3){
if(g[1][1]+g[1][2]+g[1][3]==15&&g[2][1]+g[2][2]+g[2][3]==15&&
g[3][1]+g[3][2]+g[3][3]==15&&g[1][1]+g[2][1]+g[3][1]==15&&
g[1][2]+g[2][2]+g[3][2]==15&&g[1][3]+g[2][3]+g[3][3]==15&&
g[1][1]+g[2][2]+g[3][3]==15&&g[1][3]+g[2][2]+g[3][1]==15){
res++;//记录一下可行解的个数
if(res==1){//记录第一次得到的解,其实也可以不记,反正只有一组解才输出,这样容易理解
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
ans[i][j]=g[i][j];
}
}
}
}
return;
}
if(g[x][y]){
dfs(x,y+1);
}
else{
for(int i=1;i<=9;i++){
if(!st[i]){
g[x][y]=i;
st[i]=true;
dfs(x,y+1);
g[x][y]=0;
st[i]=false;
}
}
}
}
int main(){
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cin>>g[i][j];
if(g[i][j]){
st[g[i][j]]=true;//0~9有些数已经用过了
}
}
}
dfs(1,1);
if(res==1){//只有一组解,输出
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
}
else{//不仅仅一组
cout<<"Too Many"<<endl;
}
return 0;
}
bang bang