【poj 2627】 Sudoku 題意&題解&程式碼(C++)
阿新 • • 發佈:2019-02-09
題目連結:
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");
}
}
}