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 }

 

posted @ 2017-07-20 22:26  Kearon  阅读(318)  评论(0编辑  收藏  举报