hdu 1026 Ignatius and the Princess I(迷宫)

链  接:点击打开链接

题  意: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;
}
		  

posted @ 2017-02-08 15:05  X_na  阅读(103)  评论(0编辑  收藏  举报