⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pku 1101 bfs 可怜的大法师之简单版.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

//PKU 1101 BFS 可怜的大法师之简单版
#define PI 3.1415926
#define MH make_heap
#define OH pop_heap
#define PH push_heap
#define PB push_back
#define OB pop_back
#define NMAX 100

typedef struct ooppain
{
	bool visited;
	bool cango;
	int len;
}ooppain;

typedef struct oopqueue
{
	int x;
	int y;
}oopqueue;

ooppain pain[NMAX][NMAX];
char map[NMAX][NMAX];
int fx;
int fy;

int search(int sx,int sy,int ex,int ey)
{
	oopqueue queue[NMAX*NMAX];
	oopqueue qt,qs;
	int s,t,i,j;
	s=0,t=0;
	qt.x=sx;
	qt.y=sy;
	pain[qt.x][qt.y].len=0;
	pain[qt.x][qt.y].visited=true;
	queue[t++]=qt;
	while(s<t)
	{
		qt=queue[s++];
//		printf("qt.x=%d qt.y=%d\n",qt.x,qt.y);
		for(i=1;i<=4;i++)
		{
			if(i==1)
			{
				j=1;//注意剪枝
				while(pain[qt.x+j][qt.y].cango==true && pain[qt.x+j][qt.y].visited==false) 
				{	qs.x=qt.x+j;	qs.y=qt.y;
					pain[qs.x][qs.y].visited=true;
					pain[qs.x][qs.y].len=pain[qt.x][qt.y].len+1;
					if(qs.x==ex && qs.y==ey) return pain[qs.x][qs.y].len;
					queue[t++]=qs;
					j++;
				}
			}
			if(i==2)
			{
				j=1;
				while(pain[qt.x-j][qt.y].cango==true && pain[qt.x-j][qt.y].visited==false) 
				{	qs.x=qt.x-j;	qs.y=qt.y;
					pain[qs.x][qs.y].visited=true;
					pain[qs.x][qs.y].len=pain[qt.x][qt.y].len+1;
					if(qs.x==ex && qs.y==ey) return pain[qs.x][qs.y].len;
					queue[t++]=qs;
					j++;
				}
			}
			if(i==3)
			{
				j=1;
				while(pain[qt.x][qt.y+j].cango==true && pain[qt.x][qt.y+j].visited==false) 
				{	qs.x=qt.x;	qs.y=qt.y+j;
					pain[qs.x][qs.y].visited=true;
					pain[qs.x][qs.y].len=pain[qt.x][qt.y].len+1;
					if(qs.x==ex && qs.y==ey) return pain[qs.x][qs.y].len;
					queue[t++]=qs;
					j++;
				}
			}
			if(i==4)
			{
				j=1;
				while(pain[qt.x][qt.y-j].cango==true && pain[qt.x][qt.y-j].visited==false) 
				{	qs.x=qt.x;	qs.y=qt.y-j;
					pain[qs.x][qs.y].visited=true;
					pain[qs.x][qs.y].len=pain[qt.x][qt.y].len+1;
					if(qs.x==ex && qs.y==ey) return pain[qs.x][qs.y].len;
					queue[t++]=qs;
					j++;
				}
			}
		}
	}
	return -1;
}

void create(int l,int h)
{	//地图的设置,将周围留出一圈的空地,外面再留一圈的障碍
	int i,j;
	for(i=1;i<=l;i++)
	{
		for(j=1;j<=h;j++)
		{
			if(map[i][j]=='X') pain[i+2][j+2].cango=false;
			else pain[i+2][j+2].cango=true;
		}
		pain[i+2][2].cango=pain[i+2][h+3].cango=true;
	}
	for(j=1;j<=h;j++)
	{
		pain[2][j+2].cango=pain[l+3][j+2].cango=true;
	}
	pain[2][2].cango=pain[2][h+3].cango=pain[l+3][2].cango=pain[l+3][h+3].cango=true;
	for(i=1;i<=l+4;i++) pain[i][1].cango=pain[i][h+4].cango=false;
	for(i=1;i<=h+4;i++) pain[1][i].cango=pain[l+4][i].cango=false;
}

void print_map(int l,int h)
{
	int i,j;
	printf("l=%d h=%d\n",l,h);
	for(i=1;i<=l+4;i++)
	{
		for(j=1;j<=h+4;j++) printf("%d ",pain[i][j].cango);
		printf("\n");
	}
}

void solve(int l,int h,int sx,int sy,int ex,int ey)
{
	int i,j,ans;
	for(i=1;i<=l+4;i++)
		for(j=1;j<=h+4;j++)
			pain[i][j].visited=false;
	pain[sx][sy].cango=pain[ex][ey].cango=true;//改为可走
//	print_map(l,h);
	ans=search(sx,sy,ex,ey);
	pain[sx][sy].cango=pain[ex][ey].cango=false;//用完后,改回来
	if(ans>=0) printf(" %d segments.\n",ans);
	else printf(" impossible.\n");
}

int main()
{
	int l,h,i,j,sx,sy,ex,ey,cnum=0,dnum;
//	freopen("game.out","w",stdout);
	scanf("%d %d",&l,&h);
	while(!(l==0 && h==0))
	{
		getchar();
		for(i=1;i<=h;i++)
		{
			for(j=1;j<=l;j++)
				scanf("%c",&map[j][i]);//注意输入时坐标对调
			getchar();
		}
		create(l,h);
//		print_map(l,h);
		dnum=0;
		printf("Board #%d:\n",++cnum);
		scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
		while(!(sx==0 && sy==0 && ex==0 && ey==0))
		{
//			printf("sx=%d\n",sx);
			sx+=2;sy+=2;ex+=2;ey+=2;
			printf("Pair %d:",++dnum);
			solve(l,h,sx,sy,ex,ey);
			scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
		}
		printf("\n");
		scanf("%d %d",&l,&h);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -