您的位置:首页 > 其它

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


本题其实并不难,就是搜索,但是最麻烦的估计就是记录路径。我用的是广搜,在每一个节点中记录下他的前驱节点,这样回溯很容易找到路径。

代码:

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