题目大意: 给你一个地图,地图中有三种元素,“.”代表空地,“x”代表墙,'1'->'9'代表怪兽,打怪兽的时间跟那个数字的时间是一致的。输入地图的长为c,宽为r,然后要求人从(0,0)走到(r-1,c-1),就是从地图的最左端走到最右端。求这个人的最短时间,还有打印出所走的路径。简单水题,唯一的亮点就是加上了一个打印路径。有点儿纠结~一开始 解题思路: 直接用优先队列+广搜搞,中途把点都放入一个map中,用二维数组来存放也可以,这里用了两种不同的方法,感觉用map,代码复杂度会低一点,但是时间复杂度可能更高。还有,用map要注意不要用原来的结构体,因为优先队列,原来的结构体排序上的运算符重载关系。存路径的时候,就是把下一个点的x,y作为二维数组的下标,然后当前点作为这个数组的值。结果就是,二维数组里面记录的是一个树,然后从末尾节点往回打印。就出现了一条路径了。要注意最后用栈让它按正常顺序打印出来。。 两种的时间都是15ms 代码:第一个代码用二维数组存路径
#include
#include
#include
#include
const int MAX=105;
const int inf=0x7fffffff;
using namespace std;
typedef struct node
{
int x,y,step,next_x,next_y;
friend bool operatorn2.step;
}
}N;
char Map[MAX][MAX];
//N path[MAX*MAX];
//mappath;
N a_path[MAX][MAX];
stackpath_ans;
int r,c;//地图行、列
int vst[MAX][MAX];
bool visited[MAX][MAX];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
N final_one;
int BFS(int sx,int sy)
{
priority_queue Q;
N pre,cur;
pre.x=sx,pre.y=sy,pre.step=0;
//visited[pre.x][pre.y]=true;
vst[pre.x][pre.y]=1;
Q.push(pre);
while(!Q.empty())
{
pre=Q.top();
Q.pop();
if(pre.x==r-1 && pre.y==c-1)
{
final_one=pre;
return pre.step;
}
for(int i=0;i<4;i++)
{
cur=pre;
cur.x+=dir[i][0];
cur.y+=dir[i][1];
if(cur.x>=0 && cur.x=0 && cur.y'0' && Map[cur.x][cur.y]<='9')
cur.step+=Map[cur.x][cur.y]-'0'+1;
//visited[cur.x][cur.y]=true;
if(cur.step"<'0' && Map[cur.x][cur.y]<='9')
for(int i=0;i(%d,%d)\n",time++,cur.x,cur.y,cur.next_x,cur.next_y);
}
printf("FINISH\n");
}
void init()
{
memset(visited,false,sizeof(visited));
for(int i=0;i
第二个代码(用map存放路径):
#include
#include
#include
#include
const int MAX=105;
const int inf=0x7fffffff;
using namespace std;
typedef struct node
{
int x,y,step,next_x,next_y;
friend bool operatorn2.step;
}
}N;
typedef struct path
{
int x,y,next_x,next_y;
friend bool operatorn2.x)
return true;
else if(n1.x==n2.x)
{
if(n1.y>n2.y)
return true;
else
return false;
}
else
return false;
}
}Pa;
char Map[MAX][MAX];
//N path[MAX*MAX];
mappath_map;
stackpath_ans;
int r,c;//地图行、列
int vst[MAX][MAX];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
Pa final_one;
int BFS(int sx,int sy)
{
priority_queue Q;
N pre,cur;
pre.x=sx,pre.y=sy,pre.step=0;
//visited[pre.x][pre.y]=true;
vst[pre.x][pre.y]=1;
Q.push(pre);
while(!Q.empty())
{
pre=Q.top();
Q.pop();
if(pre.x==r-1 && pre.y==c-1)
{
final_one.x=pre.x;
final_one.y=pre.y;
return pre.step;
}
for(int i=0;i<4;i++)
{
cur=pre;
cur.x+=dir[i][0];
cur.y+=dir[i][1];
if(cur.x>=0 && cur.x=0 && cur.y'0' && Map[cur.x][cur.y]<='9')
cur.step+=Map[cur.x][cur.y]-'0'+1;
//visited[cur.x][cur.y]=true;
if(cur.step"<'0' && Map[cur.x][cur.y]<='9')
for(int i=0;i(%d,%d)\n",time++,cur.x,cur.y,cur.next_x,cur.next_y);
}
printf("FINISH\n");
}
void init()
{
for(int i=0;i