数独挑战(牛客)
鏈接:登錄—專業IT筆試面試備考平臺_牛客網
來源:牛客網
?
數獨是一種填數字游戲,英文名叫 Sudoku,起源于瑞士,上世紀 70 年代由美國一家數學邏輯游戲雜志首先發表,名為 Number Place,后在日本流行,1984 年將 Sudoku 命名為數獨,即 “獨立的數字” 的縮寫,意思是 “在每一格只有一個數字”。
2004 年,曾任中國香港高等法院法官的高樂德 (Wayne Gould) 把這款游戲帶到英國,成為英國流行的數學智力拼圖游戲。
?
玩家需要根據 9×99 \times 99×9 盤面上的已知數字,推理出所有剩余位置的數字,并滿足每一行、每一列、每一個粗線九宮格內的數字包含有 1-9 的數字,且不重復。
現在給你一個數獨,請你解答出來。每個數獨保證有且只有一個解。
輸入描述:
輸入僅一組數據,共 9 行 9 列,表示初始數獨(其中 0 表示數獨中的空位)。輸出描述:
輸出共 9 行 9 列,表示數獨的解。注意?末沒有空格。示例1
輸入
5 3 0 0 7 0 0 0 0 6 0 0 1 9 5 0 0 0 0 9 8 0 0 0 0 6 0 8 0 0 0 6 0 0 0 3 4 0 0 8 0 3 0 0 1 7 0 0 0 2 0 0 0 6 0 6 0 0 0 0 2 8 0 0 0 0 4 1 9 0 0 5 0 0 0 0 8 0 0 7 9輸出
5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7 9 1 7 1 3 9 2 4 8 5 6 9 6 1 5 3 7 2 8 4 2 8 7 4 1 9 6 3 5 3 4 5 2 8 6 1 7 9分析:
對于題意:即在列、行以及加粗九宮格三種范圍中找出唯一數獨解
對于思路:只需要搜索每個處于0值的每種可能,具體思路于代碼注釋中
對于當前我個人而言,值得注意的是:對于二維數組,使用的是g[x][y],其x含義是行,y含義是列,使用二者需要注意。
#include<bits/stdc++.h> using namespace std;int g[11][11];///判斷該(x,y)上的位置對應的行、列、對應九宮格中是否有重復的數字 bool check(int x,int y,int v){for( int i = 0; i < 9; i ++ ){if( g[i][y] == v )return 0;///判斷行if( g[x][i] == v )return 0;///判斷列}int xx = x/3*3,yy = y/3*3;///向下取整的得出當前坐標對應加粗九宮格的開頭坐標for( int i = xx; i <= xx+2; i ++ ){for( int j = yy; j <= yy+2; j ++ ){if( g[i][j] == v )return 0;///判斷九宮格}}return 1; }///每個位置都搜索判斷是否為0 為0則check判斷符合條件的數 不為0則繼續搜索 void dfs( int x, int y ){if( x == 9 && y == 0 ){///枚舉完成所有的情況for( int i = 0; i < 9; i ++ ){for( int j = 0; j < 9; j ++ ){printf("%d%c",g[i][j],j==8?'\n':' ' );///新學到的結尾按情況輸出空格或者換行}}return;}if( y == 9 ){///如果枚舉完一行,則換下一行x+1dfs(x+1,0);}else{///否則每個位置都枚舉判斷是否為0值if( g[x][y] ){dfs(x,y+1);}else if( !g[x][y] ) {///0值則搜索判斷是否符合條件for( int i = 1; i <= 9; i ++ ){if(check(x,y,i)){g[x][y] = i;dfs(x,y+1);g[x][y] = 0;///記得清零回溯}}}} }int main(){for( int i = 0; i < 9; i ++ )for( int j = 0; j < 9; j ++ )cin >> g[i][j];dfs(0,0);return 0; }總結
- 上一篇: explaining and harne
- 下一篇: Qt中Label标签的使用