事先声明:我是个究极蒟蒻,不会随机数,所以只能手输雷的位置了
作者注释掉的部分是用于点到“0”时探查周围的,但实践证明会TLE,所以没办法了=(
对以上两个问题有什么好的解决办法欢迎留言
#include<bits/stdc++.h>
using namespace std;
int lst[100][100],cover[100][100];
void safe(int a,int b) {
cover[a-1][b-1]=0;
cover[a-1][b]=0;
cover[a-1][b+1]=0;
cover[a][b-1]=0;
cover[a][b+1]=0;
cover[a+1][b-1]=0;
cover[a+1][b]=0;
cover[a+1][b+1]=0;
// if(lst[a-1][b-1]==0)safe(a-1,b-1);
// if(lst[a-1][b]==0)safe(a-1,b);
// if(lst[a-1][b+1]==0)safe(a-1,b+1);
// if(lst[a][b-1]==0)safe(a,b-1);
// if(lst[a][b-1]==0)safe(a,b+1);
// if(lst[a+1][b-1]==0)safe(a+1,b-1);
// if(lst[a+1][b]==0)safe(a+1,b);
// if(lst[a+1][b+1]==0)safe(a+1,b+1);
}
int main() {
int n,m,x,a,b,cz,lose=0;
cout<<"请输入棋盘的长宽和雷的数量(长宽均小于100)"<<endl;
cin>>n>>m>>x;
int cnt=n*m;
if(m*n<=x) {
cout<<"Error:雷数大于等于总方格数"<<endl;
return 0;
}
for(int i=0; i<=n; i++) {
for(int j=0; j<=m; j++) {
lst[i][j]=0;
cover[i][j]=1;
}
}
for(int i=0; i<x; i++) {
for(int j=0; j<1; j++) {
cout<<"请输入第"<<i+1<<"颗雷的位置(行/列)"<<endl;
cin>>a>>b;
if(lst[a][b]==-1) {
cout<<"Error:此处已有雷,请换个位置"<<endl;
i--;
}
}
lst[a][b]=-1;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(lst[i][j]!=-1) {
if(lst[i-1][j-1]==-1)lst[i][j]++;
if(lst[i-1][j]==-1)lst[i][j]++;
if(lst[i-1][j+1]==-1)lst[i][j]++;
if(lst[i][j-1]==-1)lst[i][j]++;
if(lst[i][j+1]==-1)lst[i][j]++;
if(lst[i+1][j-1]==-1)lst[i][j]++;
if(lst[i+1][j]==-1)lst[i][j]++;
if(lst[i+1][j+1]==-1)lst[i][j]++;
}
}
}
cout<<" ";
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
}
cout<<endl<<endl;
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
else cout<<" ";
for(int j=1; j<=m; j++) {
cout<<"? ";
}
cout<<endl;
}
while(lose==0) {
cout<<"请输入操作(输入数字):"<<endl<<"1.翻看"<<endl<<"2.标记(标记为#)"<<endl<<"3.撤销标记"<<endl<<"输入其它数字均作为3处理"<<endl;
cin>>cz;
if(cz==1) {
cout<<"请输入要翻看的格子(行/列)"<<endl;
cin>>a>>b;
cover[a][b]=0;
if(lst[a][b]==0)safe(a,b);
cnt--;
} else if(cz==2) {
cout<<"请输入要标记的格子(行/列)"<<endl;
cin>>a>>b;
cover[a][b]=2;
cnt--;
} else {
cout<<"请输入要撤销标记的格子(行/列)"<<endl;
cin>>a>>b;
cover[a][b]=1;
}
cout<<" ";
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
}
cout<<endl<<endl;
for(int i=1; i<=n; i++) {
cout<<i;
if(i<10)cout<<" ";
else cout<<" ";
for(int j=1; j<=m; j++) {
if(cover[i][j]==0) {
if(lst[i][j]==-1) {
cout<<"! ";
lose=1;
} else if(lst[i][j]==0)cout<<" ";
else cout<<lst[i][j]<<" ";
} else if(cover[i][j]==2)cout<<"# ";
else cout<<"? ";
}
cout<<endl;
}
if(lose==1) {
cout<<"你 失 败 了";
return 0;
}
if(cnt==0) {
cout<<"你 赢 了";
return 0;
}
}
}