输入
输入第一行是4个整数n、m、k和l,含义如题干所述。接下来k行,每行2个数字i和j,表示每个雷的坐标,即雷在第i行第j列的格子里。接下来l行,每行2个数字i和j,表示用户点击信息,即用户点击了第i行第j列的格子。(m, n, i, j不超过20;k不超过50,l不超过200)
输出
对于用户的每个点击信息:(1)如果用户点击的格子是已被打开的格子,则点击无效,忽略该点击。(2)如果点击的格子是地雷,则输出“You lose”,程序退出;(3)如果点击的格子不是地雷,则输出点击后的游戏界面,即n行m列空格间隔的整数,此外,若用户获胜,则输出“You win”。对用户每个有效点击输出的信息用回车间隔。
题解:
该题和力扣上的扫雷题相似
力扣题目链接
题解
该题目与力扣不同的是,力扣要求对一次点击结果进行输出,该题要对多次点击进行输出,还要判断成功和失败。
题解都是一样的,点击一点,然后深度优先遍历,直至遇到旁边有雷的点,然后对雷数进行输出。
代码:
#include<iostream>
using namespace std;
struct dian
{
int val;
bool visited;
bool mine;
};
int have(dian (*a)[20],int n,int m,int p,int q)//统计周围有多少地雷
{
int sum=0;
if(p-1>=0)
{
if(a[p-1][q].mine==true)
{
sum++;
}
if(q-1>=0)
{
if(a[p-1][q-1].mine==true)
{
sum++;
}
}
if(q+1<m)
{
if(a[p-1][q+1].mine==true)
{
sum++;
}
}
}
if(q-1>=0)
{
if(a[p][q-1].mine==true)
{
sum++;
}
}
if(q+1<m)
{
if(a[p][q+1].mine==true)
{
sum++;
}
}
if(p+1<n)
{
if(a[p+1][q].mine==true)
{
sum++;
}
if(q-1>=0)
{
if(a[p+1][q-1].mine==true)
{
sum++;
}
}
if(q+1<m)
{
if(a[p+1][q+1].mine==true)
{
sum++;
}
}
}
return sum;
}
void print(dian (*a)[20],int n,int m)//打印棋盘
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cout<<a[i][j].val<<" ";
}
cout<<"\n";
}
}
void bianli(dian (*a)[20],int n,int m,int p,int q)//遍历
{
if((p<0)||(p>=n)||(q<0)||(q>=m)||(a[p][q].mine==true))
{
return ;
}
a[p][q].val=have(a,n,m,p,q);
a[p][q].visited=true;
if(a[p][q].val>0)
{
return ;
}
if(a[p-1][q].visited!=true)
{
bianli(a,n,m,p-1,q);
}
if(a[p-1][q-1].visited!=true)
{
bianli(a,n,m,p-1,q-1);
}
if(a[p-1][q+1].visited!=true)
{
bianli(a,n,m,p-1,q+1);
}
if(a[p][q-1].visited!=true)
{
bianli(a,n,m,p,q-1);
}
if(a[p][q+1].visited!=true)
{
bianli(a,n,m,p,q+1);
}
if(a[p+1][q].visited!=true)
{
bianli(a,n,m,p+1,q);
}
if(a[p+1][q-1].visited!=true)
{
bianli(a,n,m,p+1,q-1);
}
if(a[p+1][q+1].visited!=true)
{
bianli(a,n,m,p+1,q+1);
}
}
bool win(dian (*a)[20],int n,int m,int k)//判断是否能赢
{
int i,j,sum=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j].val==-1)
{
sum++;
}
}
}
if(sum==k)
{
return true;
}
return false;
}
int main()
{
int i,j,n,m,k,l,p,q;
cin>>n>>m>>k>>l;
int sum=0;
dian a[20][20];
for(i=0;i<n;i++)//二维数组初始化
{
for(j=0;j<m;j++)
{
a[i][j].val=-1;
a[i][j].visited=false;
a[i][j].mine=false;
}
}
for(i=0;i<k;i++)//设置地雷
{
cin>>p>>q;
if(a[p][q].mine!=true)
{
a[p][q].mine=true;
sum++;
}
a[p][q].visited=false;
}
for(i=0;i<l;i++)//输入点击的位置
{
cin>>p>>q;
if(a[p][q].visited==true)
{
continue;
}
if(a[p][q].mine==true)//点到雷上
{
cout<<"You lose";
exit(0);
}
else
{
bianli(a,n,m,p,q);
print(a,n,m);
if(win(a,n,m,sum))
{
cout<<"You win";
exit(0);
}
else
{
cout<<"\n";
}
}
}
return 0;
}
结果展示: