poj1376 搜索(BFS)

来源:互联网 发布:windows系统监控 编辑:程序博客网 时间:2024/06/07 22:08

题目: http://poj.org/problem?id=1376

题意: 可以给机器人发两种指令:(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;}


原创粉丝点击