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");
}
}
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");
}
}
相关文章推荐
- HDOJ1026(Ignatius and the Princess I)
- hdoj 1026 Ignatius and the Princess I 【bfs + 路径记录 【好题】 】
- 【BFS】HDOJ 1026 Ignatius and the Princess I
- HDOJ 1026 Ignatius and the Princess I (BFS + 优先队列 + 输出路径)
- HDOJ 1026 Ignatius and the Princess I (BFS优先队列超时 TLE)
- HDOJ HDU 1026 Ignatius and the Princess I
- hdoj_1026Ignatius and the Princess I
- HDOJ 1026 Ignatius and the Princess I 解题报告
- hdoj_1026Ignatius and the Princess I
- hdoj 1026 搜索
- ACM HDOJ 1026(Ignatius and the Princess I)
- hdoj 1026 Ignatius and the Princess I 最小步数,并且保存路径
- HDOJ1026 优先队列
- [置顶] HDOJ 1026 Ignatius and the Princess I (BFS+优先队列+记录路径)
- hdoj 1026
- 【HDOJ】1026 Ignatius and the Princess I
- HDOJ 1026 Ignatius and the Princess I
- bfs--hdoj1026(打印路径)
- HDOJ_1026_Ignatius and the Princess I
- HDOJ 1026 BFS