【HihoCoder - 1268】九宫 (dfs,深搜)
題干:
小Hi最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1~9不重復的填入一個3*3的矩陣當中,使得每一行、每一列和每一條對角線的和都是相同的。
三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣:“二四為肩,六八為足,左三右七,戴九履一,五居其中”,通過這樣的一句口訣就能夠非常完美的構造出一個九宮格來。
有意思的是,所有的三階幻方,都可以通過這樣一個九宮格進行若干鏡像和旋轉操作之后得到。現在小Hi準備將一個三階幻方(不一定是上圖中的那個)中的一些數組抹掉,交給鄰居家的小朋友來進行還原,并且希望她能夠判斷出究竟是不是只有一組解。
而你呢,也被小Hi交付了同樣的任務,但是不同的是,你需要寫一個程序~
Input
輸入僅包含單組測試數據。
每組測試數據為一個3*3的矩陣,其中為0的部分表示被小Hi抹去的部分。
對于100%的數據,滿足給出的矩陣至少能還原出一組可行的三階幻方。
Output
如果僅能還原出一組可行的三階幻方,則將其輸出,否則輸出“Too?Many”(不包含引號)。
Sample Input
0 7 2 0 5 0 0 3 0Sample Output
6 7 2 1 5 9 8 3 4解題報告:
? ? 簡化版的數獨。POJ2676 - 數獨
? ?這題要注意兩個地方,ok函數中注釋掉的那一部分,如果用那一部分,也可以ac。第二就是,如果用了這個第一部分,記住a數組一定要開15,開14就炸了。。。因為你是從1開始的啊!不然就會越界了、
AC代碼:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int maze[4][4]; bool book[10]; int cpy[4][4]; int a[100]; int cnt; bool ok(); void dfs(int x,int y); void aprint(); int main() {int tmp;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){scanf("%d",&tmp);maze[i][j]=tmp;book[tmp]=true;}}dfs(1,1);if(cnt==1) {aprint();}else {printf("Too Many");}return 0 ; } void dfs(int x,int y){ // printf("");if(x==4&&y==1){if(ok()){cnt++;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){cpy[i][j]=maze[i][j];}}}return;}if(maze[x][y]==0){for(int i=1;i<10;i++){if(!book[i]){book[i]=1;maze[x][y]=i;if(y==3){dfs(x+1,1);}else{dfs(x,y+1);}maze[x][y]=0;book[i]=0;}}}else{if(y==3){dfs(x+1,1);}else{dfs(x,y+1);}} } bool ok(){int a[15]={0};int flag=1;a[1]=maze[1][1]+maze[1][2]+maze[1][3];a[2]=maze[2][1]+maze[2][2]+maze[2][3];a[3]=maze[3][1]+maze[3][2]+maze[3][3];a[4]=maze[1][1]+maze[2][1]+maze[3][1];a[5]=maze[1][2]+maze[2][2]+maze[3][2];a[6]=maze[1][3]+maze[2][3]+maze[3][3];a[7]=maze[1][1]+maze[2][2]+maze[3][3];a[8]=maze[3][1]+maze[2][2]+maze[1][3];for(int i=1;i<=8;i++){if(a[i]!=15) flag=0;}return flag; // int r1=maze[1][1]+maze[1][2]+maze[1][3]; // int r2=maze[2][1]+maze[2][2]+maze[2][3]; // int r3=maze[3][1]+maze[3][2]+maze[3][3]; // int c1=maze[1][1]+maze[2][1]+maze[3][1]; // int c2=maze[1][2]+maze[2][2]+maze[3][2]; // int c3=maze[1][3]+maze[2][3]+maze[3][3]; // int dui1=maze[1][1]+maze[2][2]+maze[3][3]; // int dui2=maze[3][1]+maze[2][2]+maze[1][3]; // a[r1]++;a[r2]++;a[r3]++;a[c1]++;a[c2]++;a[c3]++;a[dui1]++;a[dui2]++; // if(a[15]==8) { // return true; // } // else return false; } void aprint(){for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){printf("%d",cpy[i][j]);if(j==3){cout <<endl;}else{printf(" ");}}} }?
總結
以上是生活随笔為你收集整理的【HihoCoder - 1268】九宫 (dfs,深搜)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NDSTray.exe - NDSTra
- 下一篇: 【POJ - 3342】Party at