扫雷

问题描述

背景

你玩儿过扫雷游戏吧?有个操作系统中带了这个小游戏,那个系统叫什么来着?;-)在游戏中要想过关,就必须要在一个 NxM 的区域上找出所有的地雷。游戏过程中,计算机会在地图上显示一些数字从而帮助你确定哪里有地雷。例如,在下面这个有两颗地雷的 4x4 的地图(*表示地雷):

*...
....
.*..
....

根据上面的地图,可以计算出应该提供给游戏者的数字如下所示:

*100
2210
1*10
1110

每个数字表示了该方格周围到底有几个地雷,当然,一个方格周围最多的时候只会有八个。

输入

输入中将包括一系列的地图,每个地图的第一行有两个整数 n 和 m(0 <n,m <= 100),它们表示了地图的行数和列数。下面的 n 行每行都有 m 个字符,其中 "." 表示安全而 "*" 表示地雷。如果地图的 n 和 m 都为 0,则表示输入结束。

输出

针对每一个地图,首先输出一行:

Field #x:

其中 x 是当前地图的编号(从 1 开始)。下面的 n 行则将地图中的 "." 以数字表示,该数字表示该方格周围有多少颗地雷。

来源

http://acm.uva.es/problemset/v101/10189.html


测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 4 4↵
  2. *...↵
  3. ....↵
  4. .*..↵
  5. ....↵
  6. 3 5↵
  7. **...↵
  8. .....↵
  9. .*...↵
  10. 0 0↵
以文本方式显示
  1. Field #1:↵
  2. *100↵
  3. 2210↵
  4. 1*10↵
  5. 1110↵
  6. Field #2:↵
  7. **100↵
  8. 33200↵
  9. 1*100↵
1秒 1024KB 0
题解思路

       维护两个数组,一个是输入数组,一个是转换之后的数组。在输入数组中遇到“*”就在输出数组对应位置的周围一圈八个位置加1。依次遍历完整个输入数组即可。

       注意:

(1)注意输出数组的初始化,用memset()函数进行初始化,使数组元素都为0。

(2)注意数组的边界,越出边界是不能处理的。


实现代码


<span style="font-family:Microsoft YaHei;font-size:14px;">#include<stdio.h>
#define N 110
int main()
{
	char a[N][N];
	int hang=1,lie=1,temp,i,j,k=1;
    int b[N][N];
	
	while(scanf("%d %d",&hang,&lie)==2)  //数据输入 
	{
		if(hang==0&&lie==0)
		break;
		for(i=0;i<N;i++)
		{
			for(j=0;j<N;j++)
			b[i][j]=0;
		}
		for(temp=0;temp<hang;temp++)
		{
			scanf("%s",a[temp]);
		}
			
	    for(i=0;i<hang;i++)
		{
			for(j=0;j<lie;j++)
			{
				if(a[i][j]=='*') 
				{
					b[i][j]++;
					b[i][j+1]++;
					b[i][j+2]++;
					b[i+1][j]++;
					b[i+1][j+2]++;
					b[i+2][j]++;
					b[i+2][j+1]++;
					b[i+2][j+2]++;
				}
			}
		}
		
		if(k>1)
		 {
		 printf("\nField #%d:\n",k);
		  k++;
		  }
		else 
		 {
		 printf("Field #%d:\n",k);
		  k++;
		  }
	    for(i=0;i<hang;i++)
		{
			for(j=0;j<lie;j++)
			{
				if(a[i][j]=='*')
				 printf("*");
			    else 
				 printf("%d",b[i+1][j+1]);
			}
			printf("\n");
		}
 	}
 	
 	return 0;
}</span>



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
struct { int num;/* int num;/* 格子当前处于什么状态 格子当前处于什么状态 格子当前处于什么状态 格子当前处于什么状态 ,1 有雷, 有雷, 0已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 已经显示过数字或者空白格子 */ int roundnum;/* int roundnum;/* 统计格子周围有多少雷 统计格子周围有多少雷 统计格子周围有多少雷 统计格子周围有多少雷 统计格子周围有多少雷 */ int flag;/ int flag;/ *右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 右键按下显示红旗的标志 ,0 没有红旗标志 没有红旗标志 没有红旗标志 没有红旗标志 ,1 有红旗标志 有红旗标志 */ }Mine[10][10]; int gameAGAIN=0;/* int gameAGAIN=0;/* 是否重来的变量 是否重来的变量 是否重来的变量 是否重来的变量 */ int gamePLAY=0;/* int gamePLAY=0;/* 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 是否第一次玩游戏的标志 */ int mineNUM;/* int mineNUM;/* 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 统计处理过的格子数 */ char randmineNUM[3];/* char randmineNUM[3];/* char randmineNUM[3];/* 显示数字的符串 显示数字的符串 显示数字的符串 显示数字的符串 */ int Keystate; int Keystate; int MouseExist; int MouseExist; int MouseButton; int MouseButton; int MouseX; int MouseX; int MouseY; int MouseY; void Init(void);/* void Init(void);/* 图形驱 图形驱 动*/ void MouseOn(void);/* void MouseOn(void);/* void MouseOn(void);/* 鼠标光显示 鼠标光显示 鼠标光显示 鼠标光显示 */ void MouseOff(void);/* void MouseOff(void);/* void MouseOff(void);/* 鼠标光隐藏 鼠标光隐藏 鼠标光隐藏 */ void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/* void MouseSetXY(int,int);/*设置 当前位设置 当前位设

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值