1. 程式人生 > >【poj 2627】 Sudoku 題意&題解&程式碼(C++)

【poj 2627】 Sudoku 題意&題解&程式碼(C++)

題目連結:
http://poj.org/problem?id=2676
題意:
給出一個未填的數獨,求這個數獨的解並輸出填好的數獨,若此數獨無解,則輸出原給定的錯誤數獨。
題解:
dfs回溯搜尋
程式碼:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int flag,T,f[15][15],c[15][15];
char shu[15];
int vis[4][4][10],visx[15
][10],visy[15][10]; void init() { memset(vis,0,sizeof(vis)); memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); } void dfs() { if (flag==1) return ; int x=-1,y=-1; for (int i=1;i<=9;i++) for (int j=1;j<=9;j++) if (c[i][j]==0) { x=i,y=j; break
; } // cout<<x<<' '<< y<<endl; if (x==-1&&y==-1) { for (int i=1;i<=9;i++) { for (int j=1;j<=9;j++) printf("%d",c[i][j]); printf("\n"); } flag=1
; return ; } for (int i=1;i<=9;i++) if (visx[x][i]==0&&visy[y][i]==0&&vis[(x-1)/3][(y-1)/3][i]==0) { visx[x][i]=1;visy[y][i]=1;vis[(x-1)/3][(y-1)/3][i]=1; c[x][y]=i; dfs(); c[x][y]=0; visx[x][i]=0;visy[y][i]=0;vis[(x-1)/3][(y-1)/3][i]=0; } } int main() { scanf("%d",&T); while(T--) { init(); for (int i=1;i<=9;i++) { scanf("%s",shu); for (int j=1;j<=9;j++) { int tmp=shu[j-1]-'0'; f[i][j]=tmp;c[i][j]=tmp; visx[i][tmp]=1; visy[j][tmp]=1; vis[(i-1)/3][(j-1)/3][tmp]=1; } } flag=0; dfs(); if (flag==0) for (int i=1;i<=9;i++) { for (int j=1;j<=9;j++) printf("%d",f[i][j]); printf("\n"); } } }