• P2327 [SCOI2005]扫雷


    题目描述

    相信大家都玩过扫雷的游戏。那是在一个 n×mn imes mn×m 的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是 n×2n imes 2n×2 的,第一列里面某些格子是雷,而第二列没有雷,如下图:

    由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。

    输入输出格式

    输入格式:

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    2
    1  1
    输出样例#1: 
    2

    Solution:

      本题其实就是个简单的模拟题,乱搞就好了。。。

      昨天晚上回寝快要迟到时,用了$5$分钟打了$80$个$if$水了$30$分。

      今天改成爆搜,结过$A$了。

      思路就是固定第一个位置为$0$或$1$,其它位置按照要求去放置,(显然答案只有三种情况:$0,1,2$),当出现冲突时说明不行。

    代码:

    #include<bits/stdc++.h>
    #define il inline
    #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
    using namespace std;
    const int N=10005,dx[3]={-1,0,1};
    int n,a[N],b[N],ans,c[N];
    bool f;
    il void dfs(int x,int k){
        if(k==1){
            b[k]=x;
            int tot=a[1]-x;
            if(tot<0||tot>1)return;
            b[2]=tot;
            dfs(x,k+1);
        }
        else if(k==n){
            int tot=0;
            if(b[n-1])tot++;
            if(b[n])tot++;
            tot=a[n]-tot;
            if(tot<0||tot>1)return;
            if(!tot){ans++;return;}
        }
        else {
            int tot=0;
            For(i,0,2){
                int xx=dx[i]+k;
                if(xx<=n&&b[xx])tot++;
            }
            tot=a[k]-tot;
            if(tot<0||tot>1)return;
            b[k+1]=tot;
            dfs(x,k+1);
        }
    }
    int main(){
        ios::sync_with_stdio(0);
        cin>>n;
        For(i,1,n){
            cin>>a[i];
            if(a[i]>3){cout<<0;return 0;}
        }
        if(n==1){
            if(a[1]==1||!a[1]){cout<<1;return 0;}
            cout<<0;return 0;
        }
        dfs(1,1);
        memset(b,0,sizeof(b));
        dfs(0,1);
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    解压缩编码列表
    按既定顺序创建目标数组
    整数的各位积和之差
    好数对的数目
    拿硬币
    设计 Goal 解析器
    【求助】win 2008 R2 远程桌面多用户,破解最大连接数2的限制
    Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次
    Java abstract class 和 interface 的区别
    忘记BIOS超级管理员密码,怎么破解?
  • 原文地址:https://www.cnblogs.com/five20/p/9060654.html
Copyright © 2020-2023  润新知