三階幻方(一維表二維進行深搜列舉)
阿新 • • 發佈:2018-12-12
三階幻方
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述:
三階幻方是最簡單的幻方,又叫九宮格,是由1,2,3,4,5,6,7,8,9九個數字組成的一個三行三列的矩陣,其對角線、橫行、縱向的的和都為15。
輸入:
無
輸出:
按字典序輸出所有的滿足條件的幻方矩陣,每兩個數字之間帶一個空格,行尾無空格,每個幻方後帶一個空行。
輸入樣例:
無
輸出樣例:
無
來源:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int checkrow[10],checkcol[10],x1,x2; int vis[10]; int str[10][10]; void dfs(int cnt) { int i,j; int row=cnt/3; int col=cnt%3; if(cnt==9) { if(x1==15&&x2==15) { for(i=0;i<3;i++) { for(j=0;j<2;j++) printf("%d ",str[i][j]); printf("%d\n",str[i][j]); } printf("\n"); } return; } for(i=1;i<=9;i++) { if(!vis[i]) { if(cnt==0||cnt==4||cnt==8) { x1+=i; if(x1>15) { x1-=i; continue; } } if(cnt==2||cnt==4||cnt==6) { x2+=i; if(x2>15) { if(cnt==0||cnt==4||cnt==8) x1-=i; x2-=i; continue; } } checkrow[row]+=i; if(checkrow[row]>15) { if(cnt==0||cnt==4||cnt==8) x1-=i; if(cnt==2||cnt==4||cnt==6) x2-=i; checkrow[row]-=i; continue; } checkcol[col]+=i; if(checkcol[col]>15) { if(cnt==0||cnt==4||cnt==8) x1-=i; if(cnt==2||cnt==4||cnt==6) x2-=i; checkrow[row]-=i; checkcol[col]-=i; ////這個分層次還原真的是難以發現。 continue; } str[row][col]=i; vis[i]=1; dfs(cnt+1); vis[i]=0; str[row][col]=0; checkcol[col]-=i; checkrow[row]-=i; if(cnt==2||cnt==4||cnt==6) x2-=i; if(cnt==0||cnt==4||cnt==8) x1-=i; } } } int main() { memset(checkrow,0,sizeof(checkrow)); memset(checkcol,0,sizeof(checkcol)); x1=0,x2=0; memset(vis,0,sizeof(vis)); dfs(0); //一維表二維進行深搜列舉 return 0; }