zoukankan      html  css  js  c++  java
  • The Monocycle UVA

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N = 30;
    const int dx[4] = { -1, 0, 1, 0 };
    const int dy[4] = { 0, -1, 0, 1 };
    int n, m;
    int sr, sc, er, ec;
    char g[N][N];
    int t[N][N][4][5];
    //t[r][c][dir][col]记录到达(r,c)处且方向为dir,底面颜色为col的最短时间
    struct node
    {
    	int r, c, dir, col;//0代表绿色
    };
    int bfs()
    {
    	queue<node> que;
    	while (!que.empty()) 
    		que.pop();
    	memset(t, -1, sizeof(t));
    	que.push({sr, sc, 0, 0});
    	while (!que.empty())
    	{
    		node tmp = que.front();
    		int r = tmp.r;
    		int c = tmp.c;
    		int dir = tmp.dir;
    		int col = tmp.col;
    		que.pop();
    		if (tmp.r == er && tmp.c == ec && tmp.col == 0)
    			return 1 + t[tmp.r][tmp.c][tmp.dir][tmp.col];
    		//直走
    		int x = r + dx[dir];
    		int y = c + dy[dir];
    		if (x >= 0 && x < n && y >= 0 && y < m && '#' != g[x][y])
    		{
    			int nextCol = (col + 1) % 5;
    			if (t[x][y][dir][nextCol] == -1)
    			{
    				t[x][y][dir][nextCol] = t[r][c][dir][col] + 1;
    				que.push({x, y, dir, nextCol});
    			}
    		}
    		//左右转
    		int nextDir = (dir + 1) % 4;
    		if (t[r][c][nextDir][col] == -1)
    		{
    			t[r][c][nextDir][col] = t[r][c][dir][col] + 1;
    			que.push({r, c, nextDir, col});
    		}
    		nextDir = ((dir - 1) % 4 + 4) % 4;
    		if (t[r][c][nextDir][col] == -1)
    		{
    			t[r][c][nextDir][col] = t[r][c][dir][col] + 1;
    			que.push({r, c, nextDir, col} );
    		}
    	}
    	return -1;
    }
    int main()
    {
    	int kase = 0;
    	while (scanf("%d%d", &n, &m) == 2 && (n + m))
    	{
    		if (kase != 0)
    			printf("
    ");
    		for (int i = 0; i < n; ++i)
    			scanf("%s", g[i]);
    		for (int i = 0; i < n; ++i)
    			for (int j = 0; j < m; ++j)
    				if ('S' == g[i][j])
    					sr = i, sc = j;
    				else if ('T' == g[i][j])
    					er = i, ec = j;
    		int ans = bfs();
    		printf("Case #%d
    ", ++kase);
    		if (-1 != ans)
    			printf("minimum time = %d sec
    ", ans);
    		else
    			printf("destination not reachable
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    ES head安装笔记, 还没有试
    sed用法笔记
    Kibana笔记
    ElasticSearch笔记
    Mongo聚合笔记
    java 判断是否为数字
    Redis 一:安装篇
    make问题:make[1] entering directory
    Java 多线程 简单实例 (消费者与生成者)的关系
    Java 多线程 简单实例 (Runnable)
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12835695.html
Copyright © 2011-2022 走看看