扫雷
游戏的目标是尽快找到雷区中的所有地雷,而不许踩到地雷。如果方块上的是地雷,将输掉游戏。如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷。你的任务是在已知地雷出现位置的情况下,得到各个方块中的数据。
Example:
for map:
*...
....
.*..
....
we have:
*100
2210
1*10
1110
I/O format:
--input--
输入有多组数据,每组数据的第一行有两个数字,m,n(0<m,n<100)表示游戏中雷区的范围为m×n。接下来m行每行有n个字符。“*” 表示有地雷,“.”表示无地雷。最后一组数据m=0,n=0表示输入结束,不需要处理。
--output--
#x:
其中 x 是当前地图的编号(从 1 开始)。下面的 n 行则将地图中的 "." 以数字表示,该数字表示该方格周围有多少颗地雷。
--example input--
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
--example output--
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
Code
//
// Created by Zirui Tao on 1/12/2018.
//
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include <algorithm>
#define max std::max
#define min std::min
//布局
char block[101][101];
//格子周围雷数
int num[101][101];
//int max(int a,int b)
//{
// return a>b?a:b;
//}
//int min(int a,int b)
//{
// return a<b?a:b;
//}
int input(int raw,int colum)
{
/**输入扫雷布局*/
memset(block,'0',sizeof(block));
for(int i=0;i<raw;++i)
{
for(int j=0;j<colum;++j)
{
scanf("%c",&block[i][j]);
}
scanf("%*c");
}
printf("%c", block[0][0]);
return 0;
}
int mineNum(int raw,int colum)
{
for(int i=0;i<raw;i++)
{
for(int j=0;j<colum;j++)
{
num[i][j]=0;
if(block[i][j]=='*')
{
printf("*");
}
else
{
//上下,行,区间左端点的最大值(>=0),区间右端点的最小值(<=row-1)
for(int k=max(i-1,0);k<=min(i+1,raw-1);k++)
{
for(int t=max(j-1,0);t<=min(j+1,colum-1);t++)
{
if(block[k][t]=='*')
{
num[i][j]++;
}
}
}
printf("%d",num[i][j]);
}
}
printf("\n");
}
return 0;
}
int main()
{
int time=0;
int raw,col;
while(scanf("%d%d",&raw,&col)!=EOF)
{
//输入行列后又回车了,所以回车也算一个字符……
scanf("%*c");
printf("raw:%d, col:%d\n", raw, col);
if(raw==0&&col==0)
exit(0);
else
{
input(raw,col);
printf("Field#%d\n",++time);
mineNum(raw,col);
}
}
return 0;
}