扫雷

相信大家都玩过扫雷的游戏。那是在一个n*n的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”任过流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和他8连通的格子里面雷的数目。现在棋盘是n*2的,第一列里某些格子是雷,而第二列没有雷,如:
o 1
* 2
* 3
* 2
o 2
* 2
* 2 ('*'代表有雷,'o'代表无雷)
由于第一类的雷有可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息求第一列雷有多少中摆放方案。

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 int n,a[10005],f[10005][2][2]={0};
 6 
 7 int find(int m,int x,int y){
 8     if(f[m][x][y]!=-1) return f[m][x][y];
 9     if(a[m]==0) 
10     {
11       if(x+y>0) {f[m][x][y]=0;return f[m][x][y];}
12       f[m][0][0]=find(m-1,0,0);
13       return f[m][0][0];
14                 }
15     if(a[m]==1)
16     {
17       if(x+y>1) {f[m][x][y]=0;return f[m][x][y];}
18       if(x+y==1) {f[m][x][y]=find(m-1,y,0);return f[m][x][y];}
19       if(x+y<1) {f[m][x][y]=find(m-1,y,1);return f[m][x][y];}         
20                }
21     
22     if(a[m]==2)
23     {
24       if(x+y>2) {f[m][x][y]=0;return f[m][x][y];}
25       if(x+y==2) {f[m][x][y]=find(m-1,y,0);return f[m][x][y];}
26       if(x+y==1) {f[m][x][y]=find(m-1,y,1);return f[m][x][y];}    
27       if(x+y==0) {f[m][x][y]=0;return f[m][x][y];}   
28                }
29     
30     if(a[m]==3)
31     {
32       if(x+y>=3) {f[m][x][y]=0;return f[m][x][y];}
33       if(x+y==2) {f[m][x][y]=find(m-1,y,1);return f[m][x][y];}    
34       if(x+y<2) {f[m][x][y]=0;return f[m][x][y];}   
35                }
36     
37     
38     }
39 
40 int main()
41 {
42     cin>>n;
43     for(int i=1;i<=n;++i)
44     {cin>>a[i];f[i][0][0]=-1;f[i][0][1]=-1;f[i][1][0]=-1;f[i][1][1]=-1;}
45     if(a[1]==0) {f[1][0][0]=1;f[1][0][1]=0;f[1][1][0]=0;f[1][1][1]=0;}
46     if(a[1]==1) {f[1][0][0]=0;f[1][0][1]=1;f[1][1][0]=1;f[1][1][1]=0;}
47     if(a[1]==2) {f[1][0][0]=0;f[1][0][1]=0;f[1][1][0]=0;f[1][1][1]=1;}
48     if(a[1]==3) {f[1][0][0]=0;f[1][0][1]=0;f[1][1][0]=0;f[1][1][1]=0;}
49     
50     cout<<find(n,0,1)+find(n,0,0)<<endl;
51     
52    // system("pause");
53 
54     } 
原文地址:https://www.cnblogs.com/noip/p/7792381.html