题目:
思路:
一开始理解成了可以直着走s次,其实不是,是可以往四周走s次。此题用bfs即可。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int n,m,p;
int spend[15];
char ma[maxn][maxn];
int vis[maxn][maxn];
int num[15];
int loc[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
struct v
{
int locx,locy;
};
void bfs()
{
queue<v>q[15];
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
if(ma[i][j]>='1'&&ma[i][j]<='9')
{
int t=ma[i][j]-'0';
num[t]++;
v temp;
temp.locx=i,temp.locy=j;
q[t].push(temp);
}
}
}
int flag=p;
while (flag)
{
for (int i=1;i<=p;i++)
{
int t=spend[i];
if(q[i].empty())
{
continue;
}
v now,next;
for (int k=0;k<t;k++)
{
int tnum=q[i].size();
for (int l=0;l<tnum;l++)
{
now=q[i].front();q[i].pop();
for (int j=0;j<4;j++)
{
next.locx=now.locx+loc[j][0];
next.locy=now.locy+loc[j][1];
if(next.locx>=0&&next.locx<n&&next.locy>=0&&next.locy<m&&ma[next.locx][next.locy]=='.'&&vis[next.locx][next.locy]==0)
{
vis[next.locx][next.locy]=1;
num[i]++;
q[i].push(next);
}
}
}
if(q[i].empty())
{
flag--;
break;
}
}
}
}
}
int main()
{
memset (num,0,sizeof(num));
memset (vis,0,sizeof(vis));
scanf("%d%d%d",&n,&m,&p);
for (int i=1;i<=p;i++)
{
scanf("%d",&spend[i]);
}
for (int i=0;i<n;i++)
scanf("%s",ma+i);
bfs();
for (int i=1;i<=p;i++)
printf("%d ",num[i]);
printf("\n");
return 0;
}