poj1376 搜索(BFS)
2012-02-29 21:08
288 查看
题目: http://poj.org/problem?id=1376
题意: 可以给机器人发两种指令:(1) GO: 一次朝一个方向移动1或2或3步 (2) TRUE: 转左或转右(一次只能转90度,不能连转两次) 。 每次执行1个指令都要花1秒。而且边界不能走。
思路: 用BFS,有三维数组保存状态,代表到达当前位置(x,y)在z方向上花的秒数(权重), 比较权重。比之前的状态权重小的,则覆盖当前状态。
题意: 可以给机器人发两种指令:(1) GO: 一次朝一个方向移动1或2或3步 (2) TRUE: 转左或转右(一次只能转90度,不能连转两次) 。 每次执行1个指令都要花1秒。而且边界不能走。
思路: 用BFS,有三维数组保存状态,代表到达当前位置(x,y)在z方向上花的秒数(权重), 比较权重。比之前的状态权重小的,则覆盖当前状态。
#include <iostream> #include <cstdio> #include <queue> #include <cstdio> #include <cstring> #include <cstdlib> using namespace std; int map[60][60]; int MinTime[60][60][4];//保存状态 int B1,B2,E1,E2; char TRUE[10]; int direction[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; int M,N; struct cnode { int x; int y; int dir;//当前的方向 int cost;//当前花的时间到达这里 }; int bfs() { int i; queue<cnode> qu; cnode node; node.x = B1; node.y = B2; if(map[B1][B2] != 0 || map[E1][E2] !=0 ) { return -1; } node.cost = 0; if(strcmp(TRUE,"east") == 0) { node.dir = 0; } else if(strcmp(TRUE,"south") == 0) { node.dir = 1; } else if(strcmp(TRUE, "west") == 0) { node.dir = 2; } else { node.dir = 3; } memset(MinTime, 127, sizeof(MinTime)); qu.push(node); cnode current; MinTime[node.x][node.y][node.dir] = 0; while(!qu.empty()) { current = qu.front(); if(current.x == E1 &¤t.y == E2) { return current.cost; } cnode jump; qu.pop(); //if(current.dir == 0) //{ for(i = 1; i <= 3; i++) { jump = current; // jump.y += i; jump.x += i * direction[current.dir][0]; jump.y += i * direction[current.dir][1]; jump.cost++; if(map[jump.x][jump.y] != 0) { break; } if(map[jump.x][jump.y] == 0 && MinTime[jump.x][jump.y][jump.dir] > jump.cost) { MinTime[jump.x][jump.y][jump.dir] = jump.cost; qu.push(jump); } } /* for(i = 1; i < 4; i++) { jump = current; jump.dir += i; jump.dir %= 4; int flag = abs(jump.dir - current.dir); if(flag == 3) { jump.cost += 1; } else { jump.cost += flag; } //if(map[jump.x][jump.y] == 0 && HasTrue[jump.x][jump.y] == false) if(map[jump.x][jump.y] == 0 && MinTime[jump.x][jump.y][jump.dir] > jump.cost) { MinTime[jump.x][jump.y][jump.dir] = jump.cost; qu.push(jump); } }*/ // HasTrue[current.x][current.y] = true; //////下面是转方向的 jump = current; jump.dir += 1; jump.dir %= 4; jump.cost++; if(map[jump.x][jump.y] == 0 && MinTime[jump.x][jump.y][jump.dir] > jump.cost) { MinTime[jump.x][jump.y][jump.dir] = jump.cost; qu.push(jump); } jump = current; jump.dir -= 1; jump.dir %= 4; if(jump.dir < 0) { jump.dir += 4; } jump.cost++; if(map[jump.x][jump.y] == 0 && MinTime[jump.x][jump.y][jump.dir] > jump.cost) { MinTime[jump.x][jump.y][jump.dir] = jump.cost; qu.push(jump); } } return -1; } int main() { // freopen("poj1376.in", "r", stdin); //freopen("g.in", "r", stdin); //freopen("poj1376.out","w",stdout); while(scanf("%d %d",&M,&N) != EOF) { if(M == 0 && N == 0) { break; } int input[M + 10][N + 10]; int i,j; for(i = 1; i <= M; i++) { for(j = 1; j <= N; j++) { scanf("%d",&input[i][j]); } } memset(map,255,sizeof(map)); for(i = 1; i <= M + 1; i++) { for(j = 1; j <= N + 1; j++) { map[i][j] = 0; } } for(i = 1; i <= M; i++) { for(j = 1; j <= N; j++) { if(input[i][j] == 1) { map[i][j] = 1; map[i][j + 1] = 1; map[i + 1][j] = 1; map[i + 1] [j + 1] = 1; } } } for(i = 1; i <= M + 1; i++) { map[i][1] = - 1; map[i][N + 1] = -1; } for(i = 1; i <= N + 1; i++) { map[M + 1][i] = -1; map[1][i] = -1; } scanf("%d %d %d %d",&B1,&B2,&E1,&E2); B1++; B2++; E1++; E2++; scanf("%s",TRUE); int ans; ans = bfs(); printf("%d\n",ans); } return 0; }
相关文章推荐
- poj1562 Oil Deposits 简单搜索,dfs和bfs都行,我用的bfs
- POJ 2251 Dungeon Master :NYOJ 353 3D dungeon (三维空间上的搜索 bfs )
- 【原】 POJ 1426 Find The Multiple BFS搜索 解题报告
- POJ - 3414 Pots(15.10.10 搜索专题)bfs
- POJ 3414-Pots 简单搜索 BFS
- POJ 3278 用队列实现BFS搜索
- POJ 1979 基础搜索 DFS\BFS 一
- Dungeon Master POJ - 2251 (三维空间BFS搜索)
- POJ 3126广度搜索BFS
- poj 3278 Catch That Cow (bfs搜索)
- poj 1426 Find The Multiple(搜索BFS的思想+ 同余模定理+二叉树+01哈夫曼编码)
- POJ 3126-Prime Path-广度优先搜索bfs
- poj 3414 Pots搜索BFS
- POJ 3278 Catch That Cow(搜索BFS)
- 【搜索】POJ-3669 BFS
- POJ2251 - Dungeon Master - 三维bfs搜索
- poj 3126 Prime Path(bfs搜索)
- POJ 3414 Pots——bfs搜索+dfs输出
- POJ1426-Find The Multiple-深度优先搜索BFS
- 搜索练习3 /poj.org/problem 3984 迷宫问题/bfs 回溯找路经