zoukankan      html  css  js  c++  java
  • UVa10047 BFS

    题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色。自行车每1秒要么骑到下一个格子,要么左转或者右转90。一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制。求到达目标格的最短时间。

    思路:可以朝3个方向搜索,多了一种颜色状态,每个结点有四个值需要保存,坐标x,坐标y,朝向,底面颜色。每个结点只可以执行一次,不然会出现死循环。所以需要vis数组标记。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    const int maxn = 30;
    
    struct node
    {
    	int x,y,s,c,dis;//x,y是坐标 s是方向 c是颜色 dis是距离
    	node(int x = 0,int y = 0,int s = 0,int c = 0,int dis = 0):x(x),y(y),s(s),c(c),dis(dis){}
    	bool operator < (const node &a) const
    	{
    		return a.dis < dis;
    	}
    };
    char map[maxn][maxn];
    int vis[maxn][maxn][4][5];
    int n,m;
    int d[4][2] = {-1,0,0,1,1,0,0,-1};
    
    std::priority_queue<node> q;
    
    int BFS(int sx,int sy,int ex,int ey)
    {
    	q.push(node(sx,sy,0,0,0));
    	vis[sx][sy][0][0];
    	node pp;
    	while(!q.empty())
    	{
    		pp =q.top(); 
    		q.pop();
    		if(pp.x == ex && pp.y == ey && pp.c == 0)
    		{
    			return pp.dis;
    		}
    		for(int i=0;i<4;i++)
    		{
    			int dx = pp.x + d[i][0];
    			int dy = pp.y + d[i][1];
    			int dis = pp.dis+1;
    			int c = (pp.c+1)%5;
    			
    			if(i == pp.s)
    			{
    				if(dx >= n || dx < 0 || dy < 0 || dy >= m)continue;
    				if(map[dx][dy] == '#' || vis[dx][dy][pp.s][c]) continue;
    				q.push(node(dx,dy,i,c,dis));
    				vis[dx][dy][pp.s][c] = 1;
    			}else
    			{
    				if((pp.s+1)%4 == i || (pp.s-1+4)%4 == i)
    				{
    					if(vis[pp.x][pp.y][i][pp.c])continue;
    					vis[pp.x][pp.y][i][pp.c] = 1;
    					q.push(node(pp.x,pp.y,i,pp.c,dis));
    				}
    			}
    		}
    	}
    
    	return -1;
    }
    int main()
    {
    	int i,j;
    	int sx,sy,ex,ey;
    	int cas = 1;
    	while(scanf("%d%d",&n,&m),n+m)
    	{
    		while(!q.empty())q.pop();
    		memset(vis,0,sizeof(vis));
    		for(i=0;i<n;i++)
    		{
    			scanf("%s",map[i]);
    			for(j=0;j<m;j++)
    			{
    				if(map[i][j] == 'S')
    					sx = i, sy = j;
    				if(map[i][j] == 'T')
    					ex = i, ey = j;
    			}
    		}
    		if(cas > 1) printf("
    ");
    		printf("Case #%d
    ",cas++);
    		int ans = BFS(sx,sy,ex,ey);
    		if(ans == -1) printf("destination not reachable
    ");
    		else printf("minimum time = %d sec
    ",ans);
    	}
    	return 0;
    }
    
    /*
    
    1 3
    S#T
    10 10
    #S.......#
    #..#.##.##
    #.##.##.##
    .#....##.#
    ##.##..#.#
    #..#.##...
    #......##.
    ..##.##...
    #.###...#.
    #.....###T
    0 0
    
    
      */
    
  • 相关阅读:
    Creating a Simple Direct2D Application
    关于ssh加密方式的理解
    关于2147217913 从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界 的问题解决方法
    关于 win2003中ASP.Net 的edit configuration 无法使用的答疑
    vc 用ado访问Oracle数据库的代码示例
    手工移除vs6的VSS绑定
    关于:无法执行值从 char 到 char 的隐性转换,因为该值的排序规则因排序规则冲突而未能解决
    vs2003 无法进行调试的经历
    关于如何在VMware上安装Puppy Linux
    VB: DataGrid 的列可见问题
  • 原文地址:https://www.cnblogs.com/BruceNoOne/p/3854313.html
Copyright © 2011-2022 走看看