标签:重要 namespace max return which 思维 next 程序 track
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7561 | Accepted: 2444 |
Description
Input
Output
Sample Input
9 10 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 7 2 2 7 south 0 0
Sample Output
12
题目大意:给一个图,然后给你起点和终点,以及开始所处的方向,要求你求出从起点到终点的最小步数,如果无法到达则输出-1。这个题注意有4点:
1、它一秒可以执行2种命令,一种是向现在所面向的方向走1-3步,另外一种是向左或向右90度转向(不能向后转)。
2、图中为1的是障碍物,是不允许通过的,包括边界也不能允许,这一点需要注意下。
题目分析:这道题就是简单BFS, 有五种转变方式, 走1步, 走2步, 走三步, 向左转, 向右转, 将这五种状态分别推入队列BFS, 记住当走一步都超出边界的时候, 再多走肯定超出边界,
可以break掉。然后就是细节的问题了, 就是说做这种题如何快速简单的建模非常重要, 将题意转化成好的程序语言表达方式, 这点需要靠多多做题来巩固。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <string> #include <algorithm> using namespace std; struct Node { int x; int y; int time; int pos; }; int m, n; int map[100][100]; int vis[100][100][5]; int B1, B2, E1, E2; int dx[4] = { -1, 0, 1, 0 }; int dy[4] = { 0, 1, 0, -1 }; string original_position; queue<Node> Q; int getPos( string str ) { if( str == "north" ) return 0; else if( str == "east" ) return 1; else if( str == "south" ) return 2; return 3; } bool canGo( int x, int y ) { if( x < 1 || x >= n || y < 1 || y >= m ) return false; if( map[x][y] || map[x+1][y] || map[x][y+1] || map[x+1][y+1] ) { return false; } return true; } int bfs() { Node start; start.x = B1; start.y = B2; start.time = 0; start.pos = getPos( original_position ); Q.push( start ); vis[start.x][start.y][start.pos] = 1; while( !Q.empty() ) { Node vn = Q.front(); Q.pop(); int x = vn.x; int y = vn.y; int time = vn.time; int pos = vn.pos; if( x == E1 && y == E2 ) return time; for( int i = 1; i <= 3; i++ ) { x += dx[vn.pos]; y += dy[vn.pos]; if( !canGo( x, y ) ) { break; } if( !vis[x][y][vn.pos] ) { Node next; next.x = x; next.y = y; next.pos = vn.pos; next.time = time + 1; vis[next.x][next.y][next.pos] = 1; Q.push( next ); } } for( int i = 0; i < 4; i++ ) { if( max( pos, i ) - min( pos, i ) == 2 ) { continue; } if( vis[vn.x][vn.y][i] ) continue; Node next; next.x = vn.x; next.y = vn.y; next.pos = i; next.time = time + 1; vis[next.x][next.y][next.pos] = 1; Q.push( next ); } } return -1; } int main() { while( cin >> n >> m && ( n || m ) ) { while( !Q.empty() ) Q.pop(); memset( map, 0, sizeof( map ) ); memset( vis, 0, sizeof( vis ) ); for( int i = 1; i <= n; i++ ) { for( int j = 1; j <= m; j++ ) { cin >> map[i][j]; } } cin >> B1 >> B2 >> E1 >> E2 >> original_position; cout << bfs() << endl; } return 0; }
最近很少写博客了, 注重思维多刷题, 不要懈怠啊, 人一我十, 人十我万!
标签:重要 namespace max return which 思维 next 程序 track
原文地址:http://www.cnblogs.com/FriskyPuppy/p/6031842.html