• 扫雷


    相信大家都玩过扫雷的游戏。那是在一个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     } 
  • 相关阅读:
    【LOJ #3058】「HNOI2019」白兔之舞(单位根反演+矩阵快速幂+MTT)
    【LOJ #2289】「THUWC 2017」在美妙的数学王国中畅游(LCT+泰勒展开)
    【LOJ #3193】「ROI 2019 Day2」机器人高尔夫球赛(DP+Map)
    【Codeforces 1119H】Triple(FWT)
    PKUWC2020 (旅)游记
    多项式算法合集
    redis入门学习
    servelt
    spring容器原理学习
    Spring MVC
  • 原文地址:https://www.cnblogs.com/noip/p/7792381.html
Copyright © 2020-2023  润新知