又是一道BFS练习题啊当做补博客凑数的吧,毕竟欠的债太多了,下次直接从窗台跳下去得了,不用老贾开窗,免得活受罪。。。。。。
题目:重生之门
代码:
#include <stdio.h>
int dx[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //代表上下左右四个方向
int que[10000001][3],num,n,m,b[1001][1001],pd[1001][1001];
/*que是队列
这里的que[][0]和que[][1]是存放横坐标和横坐标
que[][2]是存放当前的秒数
num是首先被感染的人数
nm分别是边界
b存放每个坐标被感染时的秒数
pd是判断当前这个坐标有没有被感染过*/
void BFS(int num)
{
int tail=num,head=0; //头指针为num
do
{
head++;
for (int i=0;i<4;i++)
{
int x1=que[head][0]+dx[i][0];
int y1=que[head][1]+dx[i][1]; //拓展的一个坐标进行初始化
if (x1>=1 && x1<=n && y1>=1 && y1<=m && pd[x1][y1]==0) //判断是否出边界且是否被感染
{
tail++; //入队列
que[tail][0]=x1; //横坐标进入新的队列元素
que[tail][1]=y1; //纵坐标进入新的队列元素
que[tail][2]=que[head][2]+1; //当前的秒数是这个节点的父节点的秒数+1
b[x1][y1]=que[tail][2]; //将这个秒数存入b数组所对应的坐标
pd[x1][y1]=1; //标记已经被感染
}
}
}while (head<tail);
}
int main()
{
int p,k[250001][2];
scanf("%d%d%d%d",&n,&m,&num,&p);
for (int i=1;i<=num;i++)
{
int x;
int y;
scanf("%d%d",&x,&y);
que[i][0]=x;
que[i][1]=y;
pd[x][y]=1; //初始化0秒的情况
}
for (int i=1;i<=p;i++)
scanf("%d%d",&k[i][0],&k[i][1]);
BFS(num);
for (int i=1;i<=p;i++)
printf("%d\n",b[k[i][0]][k[i][1]]); //输出每一个元帅所在坐标的b的值
return 0;
}
数组要开大!!!
数组要开大!!!
数组要开大!!!
重要的话说三遍
一定要开n*m!!!!!