扫雷 Minesweeper
题目要点:
这个题目是一个很简单的题目,录入雷区,然后逐个点查看附近8个点是否有雷,不过对于某些特别的边界(四个对角等)要注意,只要把查询的边界划分清楚就不会出现错误的。
另外题目要求每个雷区需要用一个空行隔开,引申意思是最后一个雷区末尾不能有空行。
以下是我的源码:
/**
* Minesweeper
*/
#include <iostream>
#include <cstdio>
using namespace std;
const int SIZE = 100;
void input(char (*area)[SIZE], int rows, int cols)
{
char str [SIZE+1];
for (int i=0; i<rows; i++)
{
cin >> str;
for (int j=0; j<cols; j++)
{
area [i] [j] = str [j];
}
}
}
char mineMap(const char (*area)[SIZE], int row, int col, int rows, int cols)
{
if (area[row][col] == '*')
{
return '*';
}
int row_init = (row-1)>0? row-1: 0;
int row_limit = (row+1)>(rows-1)? (rows-1): row+1;//控制好边界
int col_init = (col-1)>0? col-1: 0;
int col_limit = (col+1)>(cols-1)? (cols-1): col+1;//控制好边界
int mines = 0;
for (int i=row_init; i<=row_limit; i++)
{
for (int j=col_init; j<=col_limit; j++)
{
if (area[i][j] == '*')
{
mines++;
}
}
}
return '0'+mines;
}
int main()
{
char area [SIZE] [SIZE];
int n,m;
int counter = 1;
while (cin >> n >> m)
{
if (n==0 && m==0)
{
break;
}
input(area, n, m);
if (counter > 1)
{
cout << endl; //样例用空行分开意思是存在的测试分开,最后一个不能有空行存在
}
printf("Field #%d:\n", counter++);
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
cout << mineMap(area, i, j, n, m);
}
cout << endl;
}
}
}