Sudoku Killer
生活随笔
收集整理的這篇文章主要介紹了
Sudoku Killer
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Problem Description
自從2006年3月10日至11日的首屆數(shù)獨(dú)世界錦標(biāo)賽以后,數(shù)獨(dú)這項(xiàng)游戲越來越受到人們的喜愛和重視。
據(jù)說,在2008北京奧運(yùn)會上,會將數(shù)獨(dú)列為一個單獨(dú)的項(xiàng)目進(jìn)行比賽,冠軍將有可能獲得的一份巨大的獎品———HDU免費(fèi)七日游外加lcy親筆簽名以及同hdu
acm team合影留念的機(jī)會。
所以全球人民前仆后繼,為了獎品日夜訓(xùn)練茶飯不思。當(dāng)然也包括初學(xué)者linle,不過他太笨了又沒有多少耐性,只能做做最最基本的數(shù)獨(dú)題,不過他還是想得到那些獎品,你能幫幫他嗎?你只要把答案告訴他就可以,不用教他是怎么做的。
據(jù)說,在2008北京奧運(yùn)會上,會將數(shù)獨(dú)列為一個單獨(dú)的項(xiàng)目進(jìn)行比賽,冠軍將有可能獲得的一份巨大的獎品———HDU免費(fèi)七日游外加lcy親筆簽名以及同hdu
acm team合影留念的機(jī)會。
所以全球人民前仆后繼,為了獎品日夜訓(xùn)練茶飯不思。當(dāng)然也包括初學(xué)者linle,不過他太笨了又沒有多少耐性,只能做做最最基本的數(shù)獨(dú)題,不過他還是想得到那些獎品,你能幫幫他嗎?你只要把答案告訴他就可以,不用教他是怎么做的。
數(shù)獨(dú)游戲的規(guī)則是這樣的:在一個9x9的方格中,你需要把數(shù)字1-9填寫到空格當(dāng)中,并且使方格的每一行和每一列中都包含1-9這九個數(shù)字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1-9這九個數(shù)字。比如有這樣一個題,大家可以仔細(xì)觀察一下,在這里面每行、每列,以及每個3x3的方格都包含1-9這九個數(shù)字。
例題:
Killer" title="Sudoku Killer">
答案:
Killer" title="Sudoku Killer">
Input
本題包含多組測試,每組之間由一個空行隔開。每組測試會給你一個 9*9
的矩陣,同一行相鄰的兩個元素用一個空格分開。其中1-9代表該位置的已經(jīng)填好的數(shù),問號(?)表示需要你填的數(shù)。
的矩陣,同一行相鄰的兩個元素用一個空格分開。其中1-9代表該位置的已經(jīng)填好的數(shù),問號(?)表示需要你填的數(shù)。
Output
對于每組測試,請輸出它的解,同一行相鄰的兩個數(shù)用一個空格分開。兩組解之間要一個空行。
對于每組測試數(shù)據(jù)保證它有且只有一個解。
對于每組測試數(shù)據(jù)保證它有且只有一個解。
Sample Input
7 1 2 ? 6 ?
3 5 8
3 5 8
? 6 5 2 ? 7
1 ? 4
1 ? 4
? ? 8 5 1 3
6 7 2
6 7 2
9 2 4 ? 5 6
? 3 7
? 3 7
5 ? 6 ? ? ?
2 4 1
2 4 1
1 ? 3 7 2 ?
9 ? 5
9 ? 5
? ? 1 9 7 5
4 8 6
4 8 6
6 ? 7 8 3 ?
5 1 9
5 1 9
8 5 9 ? 4 ?
? 2 3
? 2 3
Sample Output
7 1 2 4 6 9
3 5 8
3 5 8
3 6 5 2 8 7
1 9 4
1 9 4
4 9 8 5 1 3
6 7 2
6 7 2
9 2 4 1 5 6
8 3 7
8 3 7
5 7 6 3 9 8
2 4 1
2 4 1
1 8 3 7 2 4
9 6 5
9 6 5
2 3 1 9 7 5
4 8 6
4 8 6
6 4 7 8 3 2
5 1 9
5 1 9
8 5 9 6 4 1
7 2 3
7 2 3
題意:數(shù)獨(dú)么,九個格子,每個格子九個空格填數(shù),每一行每一列都只能有1~9中的一個數(shù);每個大格子里的數(shù)也不能重復(fù);
解題思路:用深搜,但是輸入有點(diǎn)蛋疼,用cin輸入會解決很多不必要的空格換行符之類的,用三個數(shù)組分別記錄每一行每一列每一個格子中的數(shù)是不是重復(fù)了,然后深搜;
感悟:從這篇代碼開始不看題解,即使寫不出來,也得三天之后才能看思路!
代碼:
#include
#include
#include
using namespace std;
const int M=9*9;
const int N=10;
int mapn[N][N];
bool col[N][N],res[N][N],mark[N][N];
int op;
struct node
{
node(int
x=0,int y=0) :x(x),y(y){}
int
x,y;//用來表示需要填的空格的坐標(biāo)
};
node nod[M];
bool check(int i,int j,int w)
{
if(col[i][w]||res[j][w]||mark[(i/3)*3+j/3][w])
#include
#include
using namespace std;
const int M=9*9;
const int N=10;
int mapn[N][N];
bool col[N][N],res[N][N],mark[N][N];
int op;
struct node
{
node(int
x=0,int y=0) :x(x),y(y){}
int
x,y;//用來表示需要填的空格的坐標(biāo)
};
node nod[M];
bool check(int i,int j,int w)
{
if(col[i][w]||res[j][w]||mark[(i/3)*3+j/3][w])
return false;
return true;
}
//void printf()
//{
// for(int
i=0;i<9;i++)
// {
//
for(int j=0;j<9;j++)
//
printf(j?" %d":"%d",mapn[i][j]);
//
printf("%d\n");
// }
//}
bool dfs(int t)
{
int
x=nod[t].x,y=nod[t].y;
if(t==op)
{
//printf();
//cout<<"找到解了"<<endl;
return true;
}
for(int
i=1;i<=9;i++)
{
if(check(x,y,i))
{
//cout<<i<<" ";
col[x][i]=1;
res[y][i]=1;
mark[(x/3)*3+y/3][i]=1;
mapn[x][y]=i;
if(dfs(t+1))
return true;
col[x][i]=0;
res[y][i]=0;
mark[(x/3)*3+y/3][i]=0;
}
bool dfs(int t)
{
int
x=nod[t].x,y=nod[t].y;
if(t==op)
{
//printf();
//cout<<"找到解了"<<endl;
return true;
}
for(int
i=1;i<=9;i++)
{
if(check(x,y,i))
{
//cout<<i<<" ";
col[x][i]=1;
res[y][i]=1;
mark[(x/3)*3+y/3][i]=1;
mapn[x][y]=i;
if(dfs(t+1))
return true;
col[x][i]=0;
res[y][i]=0;
mark[(x/3)*3+y/3][i]=0;
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
char
str;
int
ans=0;
while(cin>>str)
{
memset(col,0,sizeof(col));
memset(res,0,sizeof(res));
memset(mark,0,sizeof(mark));
op=0;
if(ans++)
printf("\n");
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
if(i!=0||j!=0)
cin>>str;
if(str>='1'&&str<='9')
{
mapn[i][j]=str-'0';
col[i][mapn[i][j]]=1;
res[j][mapn[i][j]]=1;
mark[(i/3)*3+j/3][mapn[i][j]]=1;
}
else
{
mapn[i][j]=0;
nod[op++]=node(i,j);
}
}
//for(int i=0;i<9;i++)
//{
// for(int
j=0;j<9;j++)
//
printf(j?" %d":"%d",mapn[i][j]);
// printf("\n");
//}
dfs(0);
for(int i=0;i<9;i++)
{
for(int j=0;j<8;j++)
cout<<mapn[i][j]<<" ";
cout<<mapn[i][8]<<endl;
}
}
return
0;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
char
str;
int
ans=0;
while(cin>>str)
{
memset(col,0,sizeof(col));
memset(res,0,sizeof(res));
memset(mark,0,sizeof(mark));
op=0;
if(ans++)
printf("\n");
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
if(i!=0||j!=0)
cin>>str;
if(str>='1'&&str<='9')
{
mapn[i][j]=str-'0';
col[i][mapn[i][j]]=1;
res[j][mapn[i][j]]=1;
mark[(i/3)*3+j/3][mapn[i][j]]=1;
}
else
{
mapn[i][j]=0;
nod[op++]=node(i,j);
}
}
//for(int i=0;i<9;i++)
//{
// for(int
j=0;j<9;j++)
//
printf(j?" %d":"%d",mapn[i][j]);
// printf("\n");
//}
dfs(0);
for(int i=0;i<9;i++)
{
for(int j=0;j<8;j++)
cout<<mapn[i][j]<<" ";
cout<<mapn[i][8]<<endl;
}
}
return
0;
}
總結(jié)
以上是生活随笔為你收集整理的Sudoku Killer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git常用命令与AndroidStudi
- 下一篇: (数据科学学习手札03)Python与R