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;
    }
    
    		
    
    
    
  • 相关阅读:
    Android Studio 如何导入源码
    多版本 jdk 的切换方法
    Markdown的常用语法
    adb常用命令
    虚拟机怎样共享ubuntu中的文件
    adb的相关配置
    【Leetcode】2的幂(整数的二进制形式,与运算)
    【Leetcode】二叉树的最小深度
    【Leetcode】合并两个有序链表
    【Leetcode】国王挖金矿
  • 原文地址:https://www.cnblogs.com/nanke/p/2134475.html
Copyright © 2011-2022 走看看