題目描述
蒜頭君今天突然開始還念童年了,想回憶回憶童年。他記得自己小時候,有一個很火的遊戲叫做數獨。便開始來了一局緊張而又刺激的高階數獨。蒜頭君做完發現沒有正解,不知道對不對? 不知道聰明的你能否給出一個標準答案?標準數獨是由一個給與了提示數字的 9×9 網格組成,我們只需將其空格填上數字,使得每一行,每一列以及每一個 3×3 宮都沒有重複的數字出現。
把上面的 * 替換成 1−9 就可以了
提醒:兩個數字之間要有一個空格,其他地方不要輸出多餘的符號。
本題答案不唯一,符合要求的答案均正確
樣例1:
輸入:
輸出:
分析:用dfs思想去一個空一個空的嘗試,將行,列,小格子裏面的數用數組裝起來方便檢測是否有重複的數字,而且這裏在輸出的控制上也是有一定技巧的(避免了下一次回溯對當前輸出造成的影響)
#include<cstdio>
char mp[10][10];
bool tx[10][10],ty[10][10],tg[10][10];//分別記錄每行,每列,每個方格中出現的數字
bool f;
void dfs(int x,int y){
if(f){
return;
}
if(x==9){
f=true;
for(int i=0;i<9;i++){//輸出地圖,避免回溯造成影響
for(int j=0;j<9;j++){
printf(" %c",mp[i][j]);
if(j==8)printf("\n");//處理行末空格
else
printf(" ");
}
}
return;
}
if(y==9){//一行填滿切到下一行
dfs(x+1,0);
return;
}
if(mp[x][y]!='*'){//不能填的位置直接跳過
dfs(x,y+1);
return;
}
for(int i=1;i<=9;i++){//嘗試9個數
if(!tx[x][i]&&!ty[y][i]&&!tg[x/3*3+y/3][i]){
tx[x][i]=true;
ty[y][i]=true;
tg[x/3*3+y/3][i]=true;
mp[x][y]=i+'0';
dfs(x,y+1);//填下一個數
tx[x][i]=false;
ty[y][i]=false;
tg[x/3*3+y/3][i]=false;
mp[x][y]='*';
}
}
}
int main(){
for(int i=0;i<9;i++){//輸入地圖
for(int j=0;j<9;j++){
scanf(" %c",&mp[i][j]);//這個地方用printf必須在前面加空格,吃掉前面輸入的空格,如果是cin就不需要
}
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(mp[i][j]!='*'){
tx[i][mp[i][j]-'0']=true;//這一行出現了這個數
ty[j][mp[i][j]-'0']=true;//這一列出現了這個數
tg[i/3*3+j/3][mp[i][j]-'0']=true;//這個方格出現了這個數
}
}
}
dfs(0,0);//從mp[0][0]這個位置開始填數;
return 0;
}
運行結果: