C++-蓝桥杯-九宫幻方[暴力搜索][无剪枝]

 1 #include <cstdio>
 2 int a[10],copy[10],cnt,ans,flag;
 3 bool check(){
 4     int sum=a[1]+a[2]+a[3];
 5     if(sum!=a[4]+a[5]+a[6])return false;
 6     if(sum!=a[1]+a[4]+a[7])return false;
 7     if(sum!=a[3]+a[5]+a[7])return false;
 8     if(sum!=a[2]+a[5]+a[8])return false;
 9     if(sum!=a[3]+a[6]+a[9])return false;
10     if(sum!=a[7]+a[8]+a[9])return false;
11     if(sum!=a[1]+a[5]+a[9])return false;
12     return true;
13 }
14 int vis[10],p[10];
15 void dfs(int n){
16     if(ans>1)return;
17     if(n==cnt){
18         if(check()){
19             flag=1,ans++;
20             for(int i=1;i<=9;i++)copy[i]=a[i];
21         }
22         return;
23     }
24     for(int i=1;i<=9;i++){
25         if(!vis[i]){
26             a[p[n+1]]=i,vis[i]=1;
27             dfs(n+1);
28             a[p[n+1]]=0,vis[i]=0;
29         }
30     }
31 }
32 int main(){
33     for(int i=1;i<=9;i++){
34         scanf("%d",&a[i]);
35         if(a[i])vis[a[i]]=1;
36         else p[++cnt]=i;
37     }
38     dfs(0);
39     if(ans>1)puts("Too Many");
40     else
41         for(int i=1;i<=9;i++){
42             printf("%d ",copy[i]);
43             if(i%3==0)puts("");
44         }
45     return 0;
46 } 

 

posted @ 2020-03-02 11:09  墨鳌  阅读(316)  评论(0编辑  收藏  举报