【FOJ】Problem 1056 扫雷游戏

Problem 1056 扫雷游戏.

题意

在已知地雷出现位置的情况下,得到各个方块中的数据
多组数据
第一行m,n(0<m,n<100)表示游戏中雷区的范围为m×n。
接下来m行每行有n个字符。“*” 表示有地雷,“.”表示无地雷。
最后一组数据m=0,n=0表示输入结束,不需要处理。

思路

两个二维数组(char型),一个input[][]储存输入的图形,一个ans[][]存放输出的图形(初始值为'0'
逐一遍历input:
如果是雷,ans中相应位置标记为雷,并把周围九宫格内非雷区域的值都+1
不是雷就跳过

笔记

  • Presentation Error 每个输出图之间要有一个空行

代码

#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;

char input[100][100], ans[100][100];
int m, n;

bool flag(char ans[][100], int i, int j){
	if(i<0 || j<0 || i>=m || j>=n)
		return false;
	if(ans[i][j]=='*')
		return false;
	return true;
}

void change(char ans[][100], int i, int j){
	//遍历以i,j为中心点的九宫格,逐一修改九宫格中的每个值
	for(int temp_i=i-1; temp_i<=i+1; temp_i++){
		for(int temp_j=j-1; temp_j<=j+1; temp_j++){
			if(flag(ans, temp_i, temp_j))//判断该位置是否可以改变值(雷和越界不需要改变)
				ans[temp_i][temp_j]++;
		}
	}
}

int main(){
	scanf("%d%d", &m, &n);
	getchar();
	while(m!=0 && n!=0){
		for(int i=0; i<m; i++)
			gets(input[i]);
		memset(ans, '0', sizeof(ans));
		for(int i=0; i<m; i++){
			for(int j=0; j<n; j++){
				if(input[i][j] == '*'){
					ans[i][j] = '*';
					change(ans, i, j);
				}
			}
		}
		for(int i=0; i<m; i++){
			for(int j=0; j<n; j++)
				printf("%c", ans[i][j]);
			printf("\n");
		}
		printf("\n");
		scanf("%d%d", &m, &n);
		getchar();
	}
	return 0;
}
发布了28 篇原创文章 · 获赞 0 · 访问量 333

猜你喜欢

转载自blog.csdn.net/qq_44531167/article/details/105104221