标签:电脑游戏 输入数据 get 多次 单位 site logs ref 自己
这是一个最短路的问题,但由于图中边的长度均为1,可以用广度优先搜索解决。
题目中可以重复访问节点,如果不加以限制就会陷入大量重复访问。
虽然可以重复访问一个位置,但是加上时间的维度,不能重复访问了。因为在时间上重复访问并不能得到更优的解或是本没有解进而可以找到解。
C++
#include <cstdio> #include <queue> #define MAXN 101 using namespace std; int N, M, T; int dirs[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; bool visited[MAXN][MAXN][300]; int start[MAXN][MAXN]; int end[MAXN][MAXN]; struct Node { int x; int y; int g; Node(int x_, int y_, int g_) : x(x_), y(y_), g(g_) {} }; bool legal(int n, int m) { return n>=1 && n<=N && m>=1 && m<=M; } int main() { scanf("%d%d%d", &N, &M, &T); for(int t=0; t<T; t++) { int r, c, a, b; scanf("%d%d%d%d", &r, &c, &a, &b); start[r][c] = a; end[r][c] = b; } queue<Node> q; q.push(Node(1,1,0)); visited[1][1][0] = true; while(!q.empty()) { Node top = q.front(); q.pop(); if(top.x==N && top.y==M) { printf("%d", top.g); break; } for(int d=0; d<4; d++) { int nx = top.x + dirs[d][0]; int ny = top.y + dirs[d][1]; int ng = top.g + 1; if(legal(nx,ny) && (ng<start[nx][ny] || ng>end[nx][ny]) && !visited[nx][ny][ng]) { visited[nx][ny][ng] = true; q.push(Node(nx,ny,ng)); } } } }
标签:电脑游戏 输入数据 get 多次 单位 site logs ref 自己
原文地址:http://www.cnblogs.com/meelo/p/7644928.html