#1268 : 九宫 [DFS]
用dfs枚举所有情况
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; int mp[10],vis[10],ans[10],mark[10]; int cnt; bool check() { int sum; for(int i=0;i<3;i++) { sum=0; for(int j=0;j<3;j++) sum+=mp[3*i+j]; if(sum!=15) return false; sum=0; for(int j=0;j<3;j++) sum+=mp[i+3*j]; if(sum!=15) return false; } if(mp[0]+mp[4]+mp[8]!=15) return false; if(mp[2]+mp[4]+mp[6]!=15) return false; return true; } void dfs(int p) { if(p==9) { if(check()) { cnt++; for (int i=0;i<9;i++) ans[i] = mp[i]; } return; } if(vis[p]) dfs(p+1); else { for(int i=1;i<=9;i++) { if(!mark[i]) { //cout<<p<<" "<<i<<endl; mp[p]=i; mark[i]=1; dfs(p+1); mark[i]=0; } } } return; } int main() { cnt=0; memset(vis,0,sizeof(vis)); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) { scanf("%d",&mp[3*i+j]); if(mp[3*i+j]!=0) { vis[3*i+j]=1; mark[mp[3*i+j]]=1; } } } dfs(0); if(cnt==1) { for(int i=0;i<3;i++) { printf("%d",ans[i*3]); for(int j=1;j<3;j++) printf(" %d",ans[i*3+j]); printf("\n"); } } else if(cnt>1) printf("Too Many\n"); }