gym-101343K-Counting Time
生活随笔
收集整理的這篇文章主要介紹了
gym-101343K-Counting Time
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /*
2 用1-9填滿方格,每個數一次,相鄰的數的位置也必須相鄰
3 已經填好一些數,求填剩下數的方案數。
4 直接把剩下的數全排列,然后判斷即可
5 */
6 #include <bits/stdc++.h>
7 using namespace std;
8 bool v[10];
9 bool vis[5][5];
10 char ma[5][5];
11 int cop[5][5];
12 int arra[10];
13 int ans=0,cnt=0;
14 int xy[8][2]={{ -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 }, { 0, 1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }};
15 void mdfs(int x,int y,int n)
16 {
17 if(n==9)
18 {
19 ans++;
20 return;
21 }
22 for(int i=0;i<8;i++)
23 {
24 int dx=x+xy[i][0];
25 int dy=y+xy[i][1];
26 if(dx<0||dy<0||dx>=3||dy>=3)
27 continue;
28 if(vis[dx][dy])
29 continue;
30 if(fabs(cop[x][y]-cop[dx][dy])==1)
31 {
32 vis[dx][dy]=1;
33 mdfs(dx,dy,n+1);
34 vis[dx][dy]=0;
35 }
36 }
37 }
38 void ndfs(int n)
39 {
40 if(n==cnt)
41 {
42 memset(vis,0,sizeof(vis));
43 int l=0;
44 int x,y;
45 for(int i=0;i<3;i++)
46 for(int j=0;j<3;j++)
47 {
48 if(ma[i][j]==0)
49 cop[i][j]=arra[l++];
50 else
51 cop[i][j]=ma[i][j];
52 if(cop[i][j]==1)
53 {
54 x=i;
55 y=j;
56 }
57 }
58 vis[x][y]=1;
59 mdfs(x,y,1);
60 return;
61 }
62 for(int i=1;i<10;i++)
63 {
64 if(v[i]) continue;
65 arra[n]=i;
66 v[i]=1;
67 ndfs(n+1);
68 v[i]=0;
69 }
70 }
71 int main()
72 {
73 memset(v,0,sizeof(v));
74 for(int i=0;i<3;i++)
75 for(int j=0;j<3;j++)
76 {
77 char c;
78 cin>>c;
79 ma[i][j]=c-'0';
80 v[ma[i][j]]=1;
81 if(ma[i][j]==0)
82 cnt++;
83 }
84 ndfs(0);
85 cout<<ans<<endl;
86 }
?
轉載于:https://www.cnblogs.com/kearon/p/7215051.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的gym-101343K-Counting Time的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++ 对优先级与结合性的理解
- 下一篇: Day28:Event对象、队列、mul