由二维搜索到三维搜索

二维:

#include<stdio.h>
#include<string.h>
struct l
{
 	int x;int y;int s;
}lp[3000];
int a[51][51],book[51][51];
int bu[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int head,tail;
int main()
{
 	int m,n,startx,starty,p,q,tx,ty,flog;
 	while(~scanf("%d %d",&m,&n))
 	{
 		memset(a,0,sizeof a);
  		memset(book,0,sizeof book);
  		for(int i=1;i<=m;i++)
  		for(int j=1;j<=n;j++)
  		scanf("%d",&a[i][j]);
  		scanf("%d %d %d %d",&startx,&starty,&p,&q);
  		//****
  		head=1;tail=1;
  		lp[tail].x=startx;
  		lp[tail].y=starty;
  		lp[tail].s=0;
  		tail++;
  		book[startx][starty]=1;
  		flog=0;
  		//****
  		while(head<tail)
  		{
  			for(int i=0;i<3;i++){
    				tx=lp[head].x+bu[i][0];
    				ty=lp[head].y+bu[i][1];
    				if(tx<1||tx>m||ty<1||ty>n)
    				continue;
    				if(a[tx][ty]==0&&book[tx][ty]==0)
    				{
     					book[tx][ty]=1;
     					lp[tail].x=tx;
     					lp[tail].y=ty;
     					lp[tail].s=lp[head].s+1;
     					tail++;///
    				}
    				if(tx==p&&ty==q)
    				{
    	 				flog=1;
     					break;
    				}
   			}
   			if(flog==1)
   			break;
   			head++;///
  		}
  		printf("%d\n",lp[tail-1].s);
 	}
}

三维:
魔王住在一个城堡里,城堡是一个ABC的立方体,可以被表示成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代表墙.tput对于每组测试数据,如果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>
struct l
{
 int x;int y;int z;int s;
}lp[625555];
int bu[6][3]={{0,-1,0},{0,1,0},{0,0,-1},{0,0,1},{-1,0,0},{1,0,0}};
int a[55][55][55];
int book[55][55][55];
int main()
{
 	int hang,lie,gao,i,j,k,n,s,f,s1;
 	scanf("%d",&n);
 	while(n--)
 	{
  		memset(book,0,sizeof book);
  		f=0;
  		scanf("%d %d %d %d",&gao,&hang,&lie,&s1);
  		for(i=0;i<gao;i++)
  		for(j=0;j<hang;j++)
  		for(k=0;k<lie;k++)
  		scanf("%d",&a[i][j][k]);
  		//****
  		int head,tail,tx,ty,tz;
  		head=1;tail=1;
  		lp[head].x=0;
  		lp[head].y=0;
  		lp[head].z=0;
  		lp[head].s=0;
  		book[0][0][0]=1;
  		tail++;///
  		//****
  		while(head<tail)
  		{
   			for(i=0;i<6;i++){
    				tz=lp[head].z+bu[i][0];
    				tx=lp[head].x+bu[i][1];
    				ty=lp[head].y+bu[i][2];
    				if(a[tz][tx][ty]||book[tz][tx][ty]||tx<0||tx>=hang||ty<0||ty>=lie||tz<0||tz>=gao)
    				continue;
    				if(a[tz][tx][ty]==0&&book[tz][tx][ty]==0)
    				{
     					book[tz][tx][ty]=1;
     					lp[tail].z=tz;
     					lp[tail].x=tx;
     					lp[tail].y=ty;
     					lp[tail].s=lp[head].s+1;
    				}
    				if((tz==gao-1)&&(tx==hang-1)&&(ty==lie-1))
    				{
     					f=1;
     					break;
    				}
    				tail++;///
   			}
   			head++;///
   			if(f)
   			break;
  		}
  		if(f==1&&lp[tail].s<=s1)
  		printf("%d\n",lp[tail].s);
  		else
  		printf("-1\n");
 	}
}

无论是二维还是三维,最主要的是定首尾,取方向,要注意head++,tail++

ZL0
发布了15 篇原创文章 · 获赞 0 · 访问量 223

猜你喜欢

转载自blog.csdn.net/ZL0_bo/article/details/105091979