相信大家都玩过扫雷的游戏。那是在一个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 }