【p1332】【模板练习】血色先锋队

又是一道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!!!!!

猜你喜欢

转载自blog.csdn.net/sericon/article/details/94592974