poj2612

扫雷输出,注意几种情况别漏。

#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个点,然后同意判断范围即可。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值