扫雷输出,注意几种情况别漏。
#include<iostream>
using namespace std;
#include<vector>
#include<math.h>
int main()
{
int n,cnt,min_x,min_y,max_x,max_y,count;
char d;
cin>>n;
vector<vector<char> > a(n);
vector<vector<char> > a1(n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>d;
a[i].push_back(d);
}
} //数据输入完毕
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>d;
a1[i].push_back(d);
}
} //数据输入完毕
count=0; //检测是否有雷被踩中
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cnt=0; //记录以此点为中心的8格中雷的数量
if(a1[i][j]=='x'&&a[i][j]=='.') //①当点击且不为雷时
{
min_x=(i-1)>0?i-1:0;
min_y=(j-1)>0?j-1:0;
max_x=(i+1)<n-1?i+1:n-1;
max_y=(j+1)<n-1?j+1:n-1;
for(int g=min_x;g<=max_x;g++)
{
for(int h=min_y;h<=max_y;h++)
{
if(a[g][h]=='*')cnt++;
}
}
cout<<cnt;
}
else if(a1[i][j]=='x'&&a[i][j]=='*') //②当点击为雷时
{
cout<<"*";
count=1;
}
else if(a[i][j]=='*'&&count==1) //三当有雷被点击时
{
cout<<"*";
}
else if(a1[i][j]=='.') //此处没雷且不点击
{
cout<<".";
}
}
cout<<endl;
}
return 0;
}
改良一下遇到雷的时候的情况:
int fangxiang[9][2]={{0,0},{0,1},{1,0},{0,-1},{-1,0},{1,-1},{-1,1},{1,1},{-1,-1}};
if(a1[i][j]=='x'&&a[i][j]=='.') //①当点击且不为雷时
{
/* min_x=(i-1)>0?i-1:0;
min_y=(j-1)>0?j-1:0;
max_x=(i+1)<n-1?i+1:n-1;
max_y=(j+1)<n-1?j+1:n-1;
for(int g=min_x;g<=max_x;g++)
{
for(int h=min_y;h<=max_y;h++)
{
if(a[g][h]=='*')cnt++;
}
}
*/
for(int s=0;s<9;s++)
{
int xx=i+fangxiang[s][0];
int yy=j+fangxiang[s][1];
if(xx>=0&&xx<n&&yy>=0&&yy<n)
if(a[xx][yy]=='*')
cnt++;
}
cout<<cnt;
}
定义了一个9行2列的方向list。用当前的i,j分别取加上这9组数,就得到周围的8个点,然后同意判断范围即可。