hdu 1026 Ignatius and the Princess I
2010-07-27 16:27
295 查看
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2699 Accepted Submission(s): 813
Special Judge
本题其实并不难,就是搜索,但是最麻烦的估计就是记录路径。我用的是广搜,在每一个节点中记录下他的前驱节点,这样回溯很容易找到路径。
代码:
Total Submission(s): 2699 Accepted Submission(s): 813
Special Judge
本题其实并不难,就是搜索,但是最麻烦的估计就是记录路径。我用的是广搜,在每一个节点中记录下他的前驱节点,这样回溯很容易找到路径。
代码:
#include<stdio.h> #include<ctype.h> #include<queue> #include<stack> using namespace std; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int n,m; struct node { int time; int x, y; int prex,prey; char data; int fight; bool operator <(const node &a) const { return a.time<time; } }s[105][105]; typedef struct t { int x, y; }T; node cur1;T cur2,next2; int bfs() { priority_queue<node> qu; int i,x1,y1; s[0][0].time=0; qu.push(s[0][0]); while(!qu.empty ()) { cur1=qu.top(); qu.pop (); if(cur1.x==n-1 && cur1.y==m-1) return 1; for(i=0;i<4;i++) { x1=cur1.x+dir[i][0]; y1=cur1.y+dir[i][1]; if(x1>=0 && x1<n && y1>=0 && y1<m) { if(s[x1][y1].data=='.' && s[x1][y1].time>cur1.time+1) { s[x1][y1].time=cur1.time+1; s[x1][y1].prex=cur1.x; s[x1][y1].prey=cur1.y; qu.push(s[x1][y1]); } else if(isdigit(s[x1][y1].data) && s[x1][y1].time>cur1.time+s[x1][y1].data-'0') { s[x1][y1].time=cur1.time+s[x1][y1].data-'0'+1; s[x1][y1].fight=1; s[x1][y1].prex=cur1.x; s[x1][y1].prey=cur1.y; qu.push(s[x1][y1]); } } } } return 0; } int main() { int i,j;char a; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) { getchar(); for(j=0;j<m;j++) { scanf("%c",&a); s[i][j].data=a; s[i][j].time=0xfffffff; s[i][j].x=i; s[i][j].y=j; s[i][j].fight=0; } } if(bfs()) { stack<T> st; cur2.x=n-1; cur2.y=m-1; st.push(cur2); while(1) { cur2=st.top (); if(cur2.x==0 && cur2.y==0) break; next2.x=s[cur2.x][cur2.y].prex; next2.y=s[cur2.x][cur2.y].prey; st.push(next2); } printf("It takes %d seconds to reach the target position, let me show you the way.\n",s[n-1][m-1].time); st.pop(); while(!st.empty ()) { cur2=st.top (); if(s[cur2.x][cur2.y].fight==1) { printf("%ds:(%d,%d)->(%d,%d)\n",s[cur2.x][cur2.y].time-(s[cur2.x][cur2.y].data-'0'),s[cur2.x][cur2.y].prex ,s[cur2.x][cur2.y].prey,cur2.x,cur2.y); for(i=1;i<=s[cur2.x][cur2.y].data-'0';i++) printf("%ds:FIGHT AT (%d,%d)\n",s[cur2.x][cur2.y].time+i-(s[cur2.x][cur2.y].data-'0'),cur2.x ,cur2.y); } else printf("%ds:(%d,%d)->(%d,%d)\n",s[cur2.x][cur2.y].time,s[cur2.x][cur2.y].prex ,s[cur2.x][cur2.y].prey,cur2.x,cur2.y); st.pop (); } } else { printf("God please help our poor hero.\n"); } printf("FINISH\n"); } return 0; }
相关文章推荐
- HDU 1026 Ignatius and the Princess I (BFS+记录路径)
- HDU - 1026 Ignatius and the Princess I
- HDU 1026 Ignatius and the Princess I (优先队列+BFS(广度优先搜索))
- HDU 1026 Ignatius and the Princess I(BFS、优先队列)
- hdu 1026 Ignatius and the Princess I(bfs+优先队列)
- hdu 1026 Ignatius and the Princess I (bfs打印路径)
- HDU 1026 Ignatius and the Princess I
- HDU 1026 Ignatius and the Princess I
- hdu - 1026 Ignatius and the Princess I (bfs+dfs)
- HDU 1026 Ignatius and the Princess I
- HDU杭电1026 Ignatius and the Princess I(迷宫问题bfs)
- HDU 1026 Ignatius and the Princess I(BFS)
- HDU 1026 Ignatius and the Princess I(优先队列bfs)
- Hdu 1026 bfs Ignatius and the Princess I
- hdu1026 Ignatius and the Princess I(广搜+记录路径)
- HDU 1026 Ignatius and the Princess I
- HDU 1026 Ignatius and the Princess I 记录 路径广搜
- HDU 1026 Ignatius and the Princess I(BFS+优先队列)
- 杭电hdu 1026 Ignatius and the Princess I 广度优先搜索
- HDU 1026 Ignatius and the Princess I(优先队列+打印路径)