其实思路很简单,难在两个地方:
一个是对于每一周的“更新”应加以考虑,因为我的思路中要去遍历找到每一个M,然后对他相邻的8个位置搜索处理(注意这不是dfs),然而怎么保证仅在本周的M上进行搜索呢?所以不能够对于牧草赋值为M。我这里的方法是把字符数组存成数字数组,然后本周的M吃到的牧草设为“本周周数+1”。
二个是要仔细读题,题目给的Y是高度,那么就代表的是二维数组的“行”,这是概念上的不同,需要注意。
整体来说,较流畅的一次解题。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int cnt=0; //全局变量,记录牧草的剩余数
int a[105][105]; //记录地图 牧草就是-1
int xmove[8]={0,0,-1,1,-1,-1,1,1};
int ymove[8]={1,-1,0,0,1,-1,1,-1};
int X,Y;
void eat(int x,int y,int nowWeek)
{
for(int i=0;i<8;i++)
{
int xx=x+xmove[i];
int yy=y+ymove[i];
if(xx<1 || yy<1 || xx>Y || yy>X )
continue;
if(a[xx][yy]==-1)
{
a[xx][yy]=nowWeek+1;
cnt--;
}
}
}
int main()
{
int x,y;
cin>>X>>Y>>x>>y;
char b[105][105]; //转存的,因为我真正想存的是数字数组。
for(int i=1;i<=Y;i++) //i表示行
for(int j=1;j<=X;j++) //j表示列
{ cin>>b[i][j];
if(b[i][j]=='.')
{
cnt++;
a[i][j]=-1; //牧草
}
else
a[i][j]=-2; //石头
}
a[Y-y+1][x]=0;
cnt--; //这是第0周被占领的。
int week=0;
while(1)
{
for(int i=1;i<=Y;i++)
{
for(int j=1;j<=X;j++)
{
if(a[i][j]==week)
eat(i,j,week);
}
}
week++;
if(cnt==0)
break;
}
cout<<week;
return 0;
}