生活随笔
收集整理的這篇文章主要介紹了
数独题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數獨(一個十分有趣的dfs實現)
今天敲了道數獨題,hdu1426,希望自己了解一下。
hdu 1426 戳這里
思路感覺不是很難,但是代碼量有點大搞得有很多bug,調試了很久才ac。
具體思路:
先構圖(感覺這個比較惡心,我是先輸入一個字符 再輸入 后面八個字符,最后輸入后面八行)這樣比較簡單但是很蠢的輸入方法比較適合我。然后就是找‘?’的點并且用結構體去儲存一下。然后就是dfs,遍歷1~9這些數字去判斷每個‘?’點的行 列 和所在方框能不能選擇該數字。
AC代碼
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include<iomanip>
using namespace std;
int map1[
11][
11];
int sum,f=
0;
struct node{
int a,b;
};
node p[
1001];
int panduan(
int x,
int y,
int k)
{
for(
int i=
1;i<=
9;i++){
if(map1[x][i]==k)
return 0;
if(map1[i][y]==k)
return 0;}
int x1=(x-
1)/
3*
3;
int y1=(y-
1)/
3*
3;
for(
int i=x1+
1;i<=x1+
3;i++)
for(
int j=y1+
1;j<=y1+
3;j++)
if(map1[i][j]==k)
return 0;
return 1;
}
void dfs(
int n)
{
if(f)
return ;
if(n==sum){ f=
1;
for(
int i=
1;i<=
9;i++){
for(
int j=
1;j<=
9;j++)
if(j==
9)
cout<<map1[i][j];
elsecout<<map1[i][j]<<
" ";
cout<<endl;}
return ;}
else{
for(
int i=
1;i<=
9;i++){
if(panduan(p[n].a,p[n].b,i)){ map1[p[n].a][p[n].b]=i;dfs(n+
1);} }
if(f)
return ;}map1[p[n].a][p[n].b]=-
1;
return ;
}
int main()
{
char num;
int t=
0;
while(
cin>>num){
if(num==
'?')map1[
1][
1]=-
1;
elsemap1[
1][
1]=num-
48;
for(
int i=
2;i<=
9;i++){
cin>>num;
if(num==
'?')map1[
1][i]=-
1;
elsemap1[
1][i]=num-
48;}
for(
int i=
2;i<=
9;i++)
for(
int j=
1;j<=
9;j++){
cin>>num;
if(num==
'?')map1[i][j]=-
1;
elsemap1[i][j]=num-
48;}sum=
0;
for(
int i=
1;i<=
9;i++)
for(
int j=
1;j<=
9;j++)
if(map1[i][j]==-
1){p[sum].a=i;p[sum].b=j;sum++;}
if(f)
cout<<endl;f=
0;dfs(
0);}
}
記住好吧!!!!!!!!!!!!!!!
總結
以上是生活随笔為你收集整理的数独题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。