考试整理

T1_挖地雷

【问题描述】挖地雷(bomp.cpp/c/pas)

穿越了茫茫沙漠后,黑暗军团的前方出现了地雷阵,该地雷阵类似于Windows操作系统自带的挖地雷游戏,但此处仅有一行地雷,如图8.5所示,表中第一行有*号的位置表示一颗地雷。而第二行每格中的数字表示与其相邻的三格中地雷的总数。

输入数据给定一行的格子数n(n≤10000)和第二行的各个数字,编程求第一行的地雷分布。

【输入格式】

输入文件为bomp.in,第一行为一个整数n,第二行为各个数字。

【输出格式】

输出文件为bomp.out,以01顺序输出地雷分布图,其中有地雷以1表示,否则以0表示。若无解,则输出“No answer”。

【输入样例】

8

2 2 2 2 3 2 2 1

【输出样例】

1 1 0 1 1 1 0 1

这个题给的标签是递推

那么我就用一个神奇的不知道有多么神奇的神仙fzy的代码来讲吧

#include<cstdio>
int a[10005],b[10005],c[10005],d[10005];        //ab和cd分别表示第一个有雷和第一个没雷的情况 
int n;
int inrange(int x) {                            //判断边界 
    if(x>=1&&x<=n)
        return 1;
    else
        return 0;
}
int main() {
    freopen("bomp.in","r",stdin);
    freopen("bomp.out","w",stdout);
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {                    //一步步读入 
        scanf("%d",&a[i]);
        c[i]=a[i];
    }
    int bj1=1;                                    //第一个flag1用作ab数组的满足情况 
    for(int i=1; i<=n; i++) {
        int bj=1;                                //表示这个位置是放还是不放 
        for(int j=i-1; j<=i+1; j++) {
            if(!inrange(j)) continue;            //判断在界内 
            if(j==i-1&&a[j]-1>0) {                //判断无解(消除对a数组的雷数目的影响,若不为0,则无解) 
                bj1=0;
                break;
            }
            if(a[j]-1<0) {                        //判断这个位置是放还是不放 (bj=1(放),bj=0(不放)) 
                bj=0;
                break;
            }
        }
        if(!bj1)                                
            break;
        if(bj) {
            b[i]=1;
            for(int j=i-1; j<=i+1; j++) {        //判断是否满足(从头开始判断,在下面判是否有解) 
                if(inrange(j))
                    a[j]--;
            }
        }
    }
    for(int i=1; i<=n; i++) {                    //立flag1
        if(a[i]>0) {
            bj1=0;
            break;
        }
    }
    int bj2=1;                                    //同理,第一个不放雷的情况 
    for(int i=2; i<=n; i++) {
        int bj=1;
        for(int j=i-1; j<=i+1; j++) {
            if(!inrange(j)) continue;
            if(j==i-1&&c[j]-1>0) {
                bj2=0;
                break;
            }
            if(c[j]-1<0) {
                bj=0;
                break;
            }
        }
        if(!bj2)
            break;
        if(bj) {
            d[i]=1;
            for(int j=i-1; j<=i+1; j++) {
                if(inrange(j))
                    c[j]--;
            }
        }
    }
    for(int i=1; i<=n; i++) {
        if(c[i]>0) {
            bj2=0;
            break;
        }
    }
    if(!bj1&&!bj2) {                                //若都不满足,则无解        
        printf("No answer");
    } else if(bj1) {                                //若flag1满足,则输出b数组 
        for(int i=1; i<=n; i++) {
            printf("%d ",b[i]);
        }
    } else {
        for(int i=1; i<=n; i++) {                    //若flag2满足,则输出d数组
            printf("%d ",d[i]);
        }
    }
    return 0;
}

(经fzy大佬审核,应该是无误了QwQ)

posted @ 2019-07-09 16:38  卍GC卐  阅读(166)  评论(0编辑  收藏  举报