记录好缺少部分的坐标,用next_permutation进行穷举,就可以得到答案了
#include <stdio.h> #include <memory.h> #include <math.h> #include <string> #include <string.h> #include <vector> #include <set> #include <stack> #include <queue> #include <algorithm> #include <map> #define I scanf #define OL puts #define O printf #define F(a,b,c) for(a=b;a<c;a++) #define FF(a,b) for(a=0;a<b;a++) #define FG(a,b) for(a=b-1;a>=0;a--) #define LEN 3000 #define MAX 0x06FFFFFF #define V vector<int> using namespace std; int mat[3][3]; bool isOK(){ int i,j,sum=0; for(i=0;i<3;i++){ sum=0; for(j=0;j<3;j++){ sum+=mat[i][j]; } if(sum!=15) return false; } for(i=0;i<3;i++){ sum=0; for(j=0;j<3;j++){ sum+=mat[j][i]; } if(sum!=15) return false; } sum=0; for(i=0;i<3;i++) sum+=mat[i][i]; if(sum!=15) return false; sum=0+mat[2][0]+mat[1][1]+mat[0][2]; if(sum!=15) return false; return true; } int main(){ // freopen("D:/CbWorkspace/blue_bridge/九宫幻方.txt","r",stdin); vector<int> kx,ky,num; int cnt=0; int hash[11]={0}; int ans[3][3]; int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++){ I("%d",&mat[i][j]); if(!mat[i][j]){ kx.push_back(i); ky.push_back(j); } hash[mat[i][j]]++; } } for(int i=1;i<=9;i++) if(!hash[i]) num.push_back(i); do{ for(i=0;i<kx.size();i++){ mat[kx[i]][ky[i]]=num[i]; } if(isOK()){ FF(i,3)FF(j,3)ans[i][j]=mat[i][j]; cnt++; if(cnt>=2) break; } }while(next_permutation(num.begin(),num.end())); if(cnt>=2){ puts("Too Many"); }else{ FF(i,3){ FF(j,3){ printf("%d",ans[i][j]); if(j!=2) printf(" "); } puts(""); } } return 0; }