zoukankan      html  css  js  c++  java
  • 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;
    }
    
    		
    
    
    
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/nanke/p/2134475.html
Copyright © 2011-2022 走看看