日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数独题

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数独题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數獨(一個十分有趣的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);} }

    記住好吧!!!!!!!!!!!!!!!

    總結

    以上是生活随笔為你收集整理的数独题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。