模拟算法,即仿照问题进行的过程,具体地展现问题情境。
要点在于全面完备地设计。
可以考虑的思路是:先完成在正常简单情境下的过程,再考虑边界或极端情形。
P1.以洛谷P2670扫雷游戏为例。
想法是,直接检查每个格子周围的地雷数,然后修改相应位置。这是朴素的简单的思维。
但考虑边界问题,数组边界上的格子在检测时会越界,同时不同边界检查位置不同,很麻烦。
所以考虑将棋盘周围都放置一个无地雷格。这样每种格子的操作都一样。
#include<iostream>
#include<string.h>//使用memset函数的前提
using namespace std;
void display(char** boa,int n,int m)
{
for(int i=1;i<n-1;i++)
{
for(int j=1;j<m-1;j++) cout<<boa[i][j];
cout<<endl;
}
}
void calculate(char** &boa,int ndex,int mdex)
{
if(boa[ndex][mdex]=='*') boa[ndex][mdex] = '*';
else
{
int num=0;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(boa[ndex+i][mdex+j]=='*') num++;
boa[ndex][mdex]=char(num+48);
}
}
int main()
{
int n,m;
cin>>n>>m;
char** board=new char*[n+2];
for(int i=0;i<n+2;i++)
{
board[i]=new char[m+2];
memset(board[i],'?',sizeof(board[i]));//memset函数注意用于一维数组
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) cin>>board[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) calculate(board,i,j);
display(board,n+2,m+2);
return 0;
}