HUD 1026 纯C代码广搜

来源:互联网 发布:宝信软件 600845 编辑:程序博客网 时间:2024/06/05 21:01

网上找的大多是用C++,不会C++也不知道<queque>头文件的话,有些解题报告看不懂。

#include<stdio.h>  int m,n,t = 0,ft[105][105],dp[105][105],q[101*101*20][2];char a[105][105];int dir[4][2]= {{0,-1},{0,1},{1,0},{-1,0}};void bfs(){int x,y,xx,yy,parent,front = 0,rear = 1,tt,i;q[0][0] = q[0][1] = 0; dp[0][0] = 0;while(front != rear){x = q[front][0]; y = q[front][1];parent = front; front++;for(i = 0; i < 4; i++){xx = x + dir[i][0]; yy = y + dir[i][1];if(xx < 0 || xx >= n || yy < 0 || yy >= m) continue;if(a[xx][yy] == 'X') continue;tt = dp[x][y] + 1;if(a[xx][yy] != '.') tt += a[xx][yy] - '0';if(dp[xx][yy] != -1 && dp[xx][yy] <= tt) continue;//此处需注意,一旦 <=  变成 < 就会爆时间dp[xx][yy] = tt;ft[xx][yy] = parent;q[rear][0] = xx; q[rear][1] = yy;rear++;}}}void show(int x,int y){int i,_=ft[x][y];if(ft[x][y] == -1) return;show(q[_][0],q[_][1]);t++;printf("%ds:(%d,%d)->(%d,%d)\n",t,q[_][0],q[_][1],x,y);if(a[x][y] != '.'){for(i = 0; i < a[x][y] - '0'; i++){printf("%ds:FIGHT AT (%d,%d)\n",++t,x,y);}}}int main(){int i,j;while(~scanf("%d%d",&n,&m)){t = 0;getchar();memset(ft,-1,sizeof(ft));memset(dp,-1,sizeof(dp));for(i = 0; i < n; i++){gets(a[i]);}bfs();if(dp[n - 1][m - 1] == -1) printf("God please help our poor hero.\nFINISH\n");else{printf("It takes %d seconds to reach the target position, let me show you the way.\n",dp[n - 1][m - 1]);show(n - 1, m - 1);printf("FINISH\n");}}return 0;}

1 0