考试整理
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)