• bzoj1088[SCOI2005]扫雷Mine


    传送门

    Description

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

    Input

      第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)

    Output

      一个数,即第一列中雷的摆放方案数。

    Sample Input

    2
    1 1

    Sample Output

    2
     

    题解

    我们可以发现,只要我们确定了第一位,根据第二行,我们就可以推出第一行的雷,因此我们只需要枚举第一个位置有没有雷,再判断推出来的雷是否合法即可。要注意的是,最后一个雷需要特判一下。

    代码

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<cmath>
     7 using namespace std;
     8 int n,ans=0;
     9 int a[10010],b[10010];
    10 bool check(){
    11     int i,j;
    12     for(i=1;i<n;++i){
    13         if(b[i]>1 || b[i]<0)  return false;
    14         b[i+1]=a[i]-b[i]-b[i-1];
    15     }
    16     if(b[n]+b[n-1]!=a[n] || b[n]>1 || b[n]<0)  return false;
    17     return true;
    18 }
    19 int main(){
    20     scanf("%d",&n);
    21     int i,j;
    22     for(i=1;i<=n;++i)  scanf("%d",&a[i]);
    23     memset(b,0,sizeof(b));
    24     if(check())  ans++;
    25     memset(b,0,sizeof(b));b[1]=1;
    26     if(check())  ans++;
    27     printf("%d
    ",ans);
    28     return 0;
    29 }
  • 相关阅读:
    listview删除item
    标准listview加图标布局
    android事件消费机制,从外传到里面,里面具有优先选择权,如果里面的不需要,则传递给外面一层消费
    listview 按最新数据展示
    给listview添加数据,添加数据之后即刻显示出来,并把数据放在listview列表的最前面
    EditText限制输入长度和限定输入数字
    josn解析常见的几种方法
    bnu Robots on a grid
    hdu 1348 Wall
    hdu poj Oulipo
  • 原文地址:https://www.cnblogs.com/lazytear/p/8855508.html
Copyright © 2020-2023  润新知