您的位置:首页 > 其它

HDOJ1026

2011-09-29 21:36 134 查看
这里对后代的处理我是按照最短路dijkstra算法来的,貌似有更简单的方法.还留待学习..

1.在这个算法里面学习了怎么使用队列这个数据结构.

2.在BFS用队列搜索里面.搜索完毕的步骤是队列为空,入队要求对其进行松弛(借鉴dijkstra)成功则进行入队操作.四周搜索完毕以后进行出队操作.其实总的说来和dijkstra算法差不多..还要注意的是.就算之前已经入队然后出对了的点.只要松弛成功以后还要入队.因为其值变化以后旁边的值也是有可能变化的.

3..很happy的说..终于做了一个比较正规的BFS了.ACM路程上又小小进步了一下.

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<string.h>

#include<iostream>

#include<queue>

#define inf 0x3f3f3f

using namespace std;

int row,col,dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}},time[101][101],zxx[101][101],zxy[101][101],hdx[101][101],hdy[101][101];

char map[101][101];

queue<int>q;

bool Judge(int x , int y)

{

if(x >= 0 && x < row && y >= 0 && y < col)

return true;

return false;

}

void bfs(int a , int b)

{

for(int i = 0 ; i < row ; i++)

{

for(int j = 0 ; j < col ; j++)

time[i][j] = inf ;

}

q.push(a);q.push(b);

time[a][b] = 0 ;

while( !q.empty() )

{

int c,d,x,y;

c = q.front();q.pop();

d = q.front();q.pop();//printf("%d %d %d %d \n",zxx[1],zxy[5],c,d);

// printf("%d %d\n",c,d);

for(int i = 0 ; i < 4 ; i++)

{

x = c + dir[i][0] ;

y = d + dir[i][1] ;

if(Judge(x , y))

{

// printf("%d %d\n",x,y);

// printf("%d %d \n",time[x][y],inf);

if(time[x][y] == inf)

{

//printf("^");

if(x != 0 || y != 0)

{

if(map[x][y] == '.')

{

// printf("%d %d\n",x,y);

time[x][y] = time[c][d] + 1 ;

zxx[x][y] = c ; zxy [x][y] = d ;

// if(x == 1 && y == 5)printf("%d %d\n",c,d);

q.push(x) ; q.push(y) ;

}

if(map[x][y] >= '1' && map[x][y] <= '9')

{

time[x][y] = time[c][d] + 1 + map[x][y] - '0' ;

zxx[x][y] = c ; zxy [x][y] = d ;

// if(x == 1 && y == 5)printf("%d %d\n",c,d);

q.push(x) ; q.push(y) ;

}

}

}

else

{

if(map[x][y] == '.' && time[x][y] > time[c][d] + 1)

{

time[x][y] = time[c][d] + 1;

zxx[x][y] = c ; zxy[x][y] = d ;

// if(x == 1 && y == 5)printf("%d %d\n",c,d);

q.push(x) ; q.push(y) ;

}

if(map[x][y] >= '1' && map[x][y] <= '9' && time[c][d] + 1 + ( map[x][y] - '0') < time[x][y])

{

time[x][y] = time[c][d] + 1 + (map[x][y] - '0') ;

zxx[x][y] = c ; zxy [x][y] = d ;

// if(x == 1 && y == 5)printf("%d %d\n",c,d);

q.push(x) ; q.push(y) ;

}

}

}

}

}

}

int main()

{

while(scanf("%d%d",&row,&col) != EOF)

{

for(int i = 0 ; i < row ; i++)

scanf("%s",map[i]);

bfs(0,0);

if(time[row-1][col-1] != inf)

{

printf("It takes %d seconds to reach the target position, let me show you the way.\n",time[row-1][col-1]) ;

int x = row -1 , y = col - 1 ;

//printf("%d %d ",zxx[1],zxy[5]);

while(x != 0 || y != 0)

{

int a , b ;

a = zxx[x][y] ;

b = zxy[x][y] ;

hdx[a][b] = x ;

hdy[a][b] = y ;

x = a ; y = b ;

}

hdx[ zxx[row-1][col-1] ][ zxy[row-1][col-1] ] = row - 1 ;

hdy[ zxx[row-1][col-1] ][ zxy[row-1][col-1] ]= col - 1 ;

int vis = 1,ans = 1 ;

x = 0 ; y = 0;

while(vis)

{

int a , b ;

if(map[x][y] == '.')

printf("%ds:(%d,%d)->(%d,%d)\n",ans++,x,y,hdx[x][y],hdy[x][y]);

else

{

for(int i = 1 ; i <= map[x][y] - '0' ; i++)

printf("%ds:FIGHT AT (%d,%d)\n",ans++,x,y);

printf("%ds:(%d,%d)->(%d,%d)\n",ans++,x,y,hdx[x][y],hdy[x][y]);

}

a = hdx[x][y] ;

b = hdy[x][y] ;

x = a ; y = b ;

if(x == row-1 && y == col - 1)vis = 0 ;

}

if(map[row-1][col-1] != '.')

{

for(int i = 1 ; i <= map[row-1][col-1] - '0' ; i++)

printf("%ds:FIGHT AT (%d,%d)\n",ans++,row-1,col-1);

}

}

else

printf("God please help our poor hero.\n");

printf("FINISH\n");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: