描述
扫雷(Minesweeper)是一个有趣的小游戏。玩家需要根据数字的提示,在不触雷的条件下把所有不是雷的区域翻开才能胜利;一旦触雷即告失败。扫雷游戏的高级(16x30,99雷)世界纪录为31.133秒,由波兰人KamilMuranski保持。
扫雷盘面中,某格中数字的含义是其周围相邻8格(如果是边界或角则相应为5格或3格)中含有的雷的个数。相信大家通过对于上图的分析,能够理解这个含义。
本题要求对于一个雷区(给定大小以及雷的位置),计算盘面所有数字的和。
输入
输入包含若干行。
第一行是两个整数M,N,以空格分开,代表雷区的行数和列数。1 <= M <= 50,1 <= N <= 50。
第二行是一个整数K,代表雷区中雷的个数,0 <= K <= M*N。
接下来K行代表K个雷的位置,每行有两个用空格分开的整数,分别代表这个雷的所在的行R(1 <= R <=M)和列C(1 <= C <=N)。数据保证这K行中没有重复。
输出
一个整数,代表该雷区中所有数字之和。注意,如果一个雷区中全是雷,其数字之和为0;如果一个雷区中没有雷,其数字之和也为0。
输入样例 1
8 8 10 1 1 1 7 3 8 4 4 4 8 5 8 6 3 6 8 7 8 8 8
输出样例 1
42
编出来的几个程序都没有过,实在不太会了,谢谢大家!
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
int M, N;//行和列
//printf("请输入行和列");
cin >> M>>N;
int **matrix=new int*[M];//二维动态数组
for (int i = 0; i < M; i++)
{
matrix[i] = new int[N];
}
//二维数组直接置为0
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
matrix[i][j] = 0;
}
}
srand(time(NULL));
int n ;//雷的数量
//printf("请输入雷的数量:");
cin >> n;
while (n--)
{
int line;
int row ;
cin >> line >> row;
if (matrix[line-1][row-1] == 0)
{
matrix[line-1][row-1] = -1;
}
else
{
continue;
}
}
int res = 0;//总和
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (matrix[i][j] != -1)
{
int leftIndex = j - 1;
int rightIndex = j + 1;
int topIndex = i - 1;
int bottomIndex = i + 1;
int left = leftIndex;
int top = topIndex;
int leftMoveStep = 0;
int topMoveStep = 0;
int count = 0;
while (true)
{
//周围八个位置的状态
if (left >= 0 && left < M && top >= 0 && top < N)
{
if (matrix[top][left] == -1)
{
count++;
}
}
//
if (left == leftIndex && top == i)
{
break;
}
if (left - leftIndex < 2 && top == topIndex)
{
leftMoveStep = 1;
topMoveStep = 0;
}
else if (left == rightIndex && top == topIndex)
{
topMoveStep = 1;
leftMoveStep = 0;
}
else if (left == rightIndex && top == bottomIndex)
{
topMoveStep = 0;
leftMoveStep = -1;
}
else if (left == leftIndex && top == bottomIndex)
{
leftMoveStep = 0;
topMoveStep = -1;
}
else if (left - leftIndex < 2 && top == bottomIndex)
{
leftMoveStep = -1;
topMoveStep = 0;
}
left += leftMoveStep;
top += topMoveStep;
}
matrix[i][j] = count;
res += count;
}
}
}
cout << res;
}