poj2251 三维bfs

该博客探讨了两种不同的算法实现,用于解决Ignatius在魔王城堡中逃脱的问题。算法通过广度优先搜索(BFS)策略,计算从起点到出口的最短路径,并在限定时间内判断是否能成功逃离。第一种实现使用三维数组表示迷宫,第二种实现则使用字符串处理和特定坐标系统。题目中给出了输入输出样例,并强调了输入数据规模较大,需要使用快速输入方法以避免超时。
摘要由CSDN通过智能技术生成

转载于 poj2251变式
Problem Description
Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A* B *C的立方体,可以被表示成 A 个 B *C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在 (A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城 堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请 输出需要多少分钟才能离开,如果不能则输出-1.

Input
输 入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块…),每块 输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)

注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.

Output
对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.

Sample Input
1 3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0

Sample Output
11

#include <stdio.h>
#include <string.h>
 
int map[60][60][60];
int vt[60][60][60] ;
 
struct N
{
    int x, y, z;
    int cnt;
 
}s[210000], e, f;
 
int xx[6]={0, 0, 0, 0, 1, -1};
int yy[6]={0, 0, -1, 1, 0, 0};
int zz[6]={1, -1, 0, 0, 0, 0};
 
int a, b, c, tt;
 
void bfs()
{
    int i, j=0, k=0 ;
    int flag = 0;
 
    e.x = 0;
    e.y = 0;
    e.z = 0;
    e.cnt = 0;
 
 
    s[k++] = e;
    vt[0][0][0] =1 ;
 
    while(j < k )
    {
        e = s[j++];
        if(e.x==a-1 && e.y==b-1 && e.z==c-1 )
        {
            if(e.cnt <= tt)
            {
                printf("%d\n", e.cnt );
                return ;
            }
            else
            {
                printf("-1\n");
                return ;
            }
        }
 
        for(i=0; i<6; i++)
        {
            f.x = e.x + xx[i];
            f.y = e.y + yy[i];
            f.z = e.z + zz[i];
 
            if( f.x>=0&&f.x<a &&f.y>=0&&f.y<b && f.z>=0 &&f.z<c&& vt[f.x][f.y][f.z]==0 && map[f.x][f.y][f.z]==1 )
            {
                f.cnt = e.cnt + 1;
                s[k++] = f;
                vt[f.x][f.y][f.z]=1;
            }
        }
    }
        printf("-1\n");
 
/*  if(flag==1 && sum <tt )
    {
        printf("%d\n", sum );
    }
    else
    {
        printf("-1\n");
    }  */
}
 
 
int main()
{
    int t;
    int i, j, k,ff;
 
    scanf("%d", &t) ;
    while(t--)
    {
        memset(map, 0, sizeof(map ));
        memset(vt, 0, sizeof(vt ));
        k = 0;
 
        scanf("%d %d  %d %d", &a, &b, &c, &tt );
 
        for(i=0; i<a; i++)
        {
            for(j=0; j<b; j++)
            {
                for(k=0; k<c; k++)
                {
                    scanf("%d", &ff );
                    if(ff==1)
                        map[i][j][k] = 0;   //memset 为0,避免冲突修改一下,1代表路,0 代表墙
                    else
                    {
                        map[i][j][k] = 1;
                    }
                }
            }
        }
 
        if(map[a-1][b-1][c-1]==0 || a+b+c>tt) //出口处是墙 或者 可能到达出口的最短时间都比妖怪回来的时间长必然逃不了
        {
            printf("-1\n");
            continue;
        }
        bfs();
 
    }
    return 0;
}

正文转载于 poj2251 discuss

#include <string.h>
#include <stdio.h>

int maze[100][100][100];
int vis[100][100][100];
int dis[100][100][100];
int q[60000];
int l,r,c;
int flag;

int dx[]={1,-1,0,0,0,0};
int dy[]={0,0,0,0,-1,1};
int dz[]={0,0,-1,1,0,0};

int bfs(int x,int y,int z)
{
	int front=0,rear=0,d,u;
	vis[x][y][z]=1;
	dis[x][y][z]=0;
	u=x*r*c+y*c+z;\\使父节点更新更简便
	q[rear++]=u;
	while(front<rear)
	{
		u=q[front++];
		x=u/(r*c);
		y=(u%(r*c))/c;
		z=(u%(r*c))%c;
		for(d=0;d<6;d++)
		{
			int nx=x+dx[d];
			int ny=y+dy[d];
			int nz=z+dz[d];
			if(nx>=0&&nx<l&&ny>=0&&ny<r&&nz>=0&&nz<c&&maze[nx][ny][nz]&&vis[nx][ny][nz]==0)
			{
				int v=nx*r*c+ny*c+nz;
				q[rear++]=v;
				vis[nx][ny][nz]=1;
				dis[nx][ny][nz]=dis[x][y][z]+1;
				if(maze[nx][ny][nz]==2)
				{
					return dis[nx][ny][nz];
				}
			}
		}
	}
	return 0;
}

int main()
{
	int i,j,k;
	char s[100];
	int a1,b1,c1;
	int time;
	
	while(scanf("%d %d %d",&l,&r,&c)==3&&l!=0&&r!=0&&c!=0)
	{
		getchar();
		flag=1;
		memset(maze,0,sizeof(maze));
		memset(vis,0,sizeof(vis));
		for(i=0;i<l;i++)
		{
			for(j=0;j<r;j++)
			{
				gets(s);
				for(k=0;k<c;k++)
				{
					if(s[k]=='S')
					{
						a1=i;
						b1=j;
						c1=k;
					}
					else if(s[k]=='.')
					{
						maze[i][j][k]=1;
					}
					else if(s[k]=='E')
					{
						maze[i][j][k]=2;
					}
				}
			}
			getchar();
		}
		
		time=bfs(a1,b1,c1);
		if(time)
		{
			printf("Escaped in %d minute(s).\n",time);
		}
		else
		{
			printf("Trapped!\n");
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值