hdu 1728 逃离迷宫

这题目跟之前的连连看还有hdu1072 都很像,就是路径受转弯次数的限制,这时vis[][]数组并非用来记录一个点是否已被访问过,而是记录经过该点的最少转弯次数,若经过该点存在更少的转弯次数的路径,则该点可以再次入队

看代码吧

#include<iostream>
#include<queue>
using namespace std;
char map[101][101];
int n,m,T,ei,ej,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[101][101];
struct node
{
	int x,y,di,turn;
};
node f;
void bfs()
{
	queue<node> Q;
	Q.push(f);
	vis[f.x][f.y]=0;
	while(!Q.empty())
	{
		node t=Q.front(),temp;
		Q.pop();
		for(int k=0;k<4;k++)
		{
			int i=dir[k][0]+t.x;
			int j=dir[k][1]+t.y;
			if(i>n||i<1||j>m||j<1||map[i][j]=='*') continue;
			if(t.di!=k&&t.di!=-1) 
				temp.turn=t.turn+1;
			else temp.turn=t.turn;//方向相同或刚出发
			if(temp.turn>T) continue;
			if(i==ei&&j==ej) {cout<<"yes"<<endl; return ;}
			if(vis[i][j]>=temp.turn)
			{
				vis[i][j]=temp.turn;
			  temp.x=i;temp.y=j;temp.di=k;
			   Q.push(temp);
			}
		}
	}
	cout<<"no"<<endl;
}
int main()
{
	int cas;
	cin>>cas;
	while(cas--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
			  cin>>map[i][j];
		cin>>T>>f.y>>f.x>>ej>>ei;//把行跟列调换回来了,题目的那种叙述很不习惯
		f.di=-1;
		f.turn=0;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				vis[i][j]=20;//也不需要初始化的很大,因为T本身最大也才10
		bfs();
	}
	return 0;
}

		


原文地址:https://www.cnblogs.com/nanke/p/2134475.html