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