hdu 1026 Ignatius and the Princess I(迷宫)

来源:互联网 发布:图标制作软件 编辑:程序博客网 时间:2024/05/06 16:30

链  接:点击打开链接

题  意:Ignatius去到一个n*m密宫求公主,他要从(0,0)点走到(n-1,m-1)点,每走一个点代表一秒,求花费的最少时间

其中 . :代表可以走   X :代表陷阱不可以走   n:代表有n个妖怪,走此处要花费n秒杀怪

思  路:广度优先搜索 + 优先队列(每次从队列中选步数最少的) +  递归打印路径

代  码:

#include<iostream>#include<string.h>#include<string>#include<queue>#include<stdio.h>using namespace std;struct node{int x,y,step;friend bool operator<(node n1,node n2)//优先选步数少的 {return n2.step<n1.step;}}s;char map[200][200];int visited[200][200];int N,M;int dir[4][2]={-1,0,1,0,0,-1,0,1};int flag=0;//标记是否能到 int path[200][200];//保存路径int time;int guai[200][200];//怪的个数  int bfs(){priority_queue<node>q;node temp,m;s.x=0;s.y=0;s.step=0;visited[s.x][s.y]=-1;q.push(s);while(!q.empty()){temp=q.top();//优先队列出队为top q.pop();for(int i=0;i<4;i++){m.x=temp.x+dir[i][0];m.y=temp.y+dir[i][1];if(m.x==(N-1)&&m.y==(M-1)){        path[m.x][m.y]=i;//记录方向 return temp.step+1+visited[m.x][m.y];}else{if(m.x>=0&&m.x<N&&m.y>=0&&m.y<M&&visited[m.x][m.y]!=-1)//可走 {    if(visited[m.x][m.y]==0)//无怪        m.step=temp.step+1;    else                     //有怪        m.step=temp.step+1+visited[m.x][m.y];    visited[m.x][m.y]=-1;     path[m.x][m.y]=i;//记录方向     q.push(m); }}}}return 0; }void PATH(int x,int y)//打印路径 {int x1,y1;if(path[x][y]==-1)   return;x1=x-dir[path[x][y]][0];y1=y-dir[path[x][y]][1];PATH(x1,y1);cout<<time<<"s:"<<"("<<x1<<","<<y1<<")"<<"->"<<"("<<x<<","<<y<<")"<<endl;    time++;    while(guai[x][y]--)    {    cout<<time<<"s:FIGHT AT ("<<x<<","<<y<<")"<<endl;    time++;}}int main(){while(cin>>N>>M){flag=0;memset(guai,0,sizeof(guai));memset(path,-1,sizeof(path));for(int i=0;i<N;i++)  for(int j=0;j<M;j++)//可以走的标记为0,有怪的标记为怪的个数,不能走的 或走过的标记为-1   {    cin>>map[i][j];    if(map[i][j]=='.')       visited[i][j]=0;    else if(map[i][j]=='X')      visited[i][j]=-1;    else      visited[i][j]=guai[i][j]=map[i][j]-'0';  }    int sum=0;  sum=bfs();     if(sum)   {   cout<<"It takes "<<sum<<" seconds to reach the target position, let me show you the way."<<endl;         time=1;     PATH(N-1,M-1);  }   else          cout<<"God please help our poor hero."<<endl;         cout<<"FINISH"<<endl;  }  return 0;}  

1 0
原创粉丝点击