问题 B: MZY寻宝
时间限制: 1 Sec 内存限制: 128 MB
提交: 149 解决: 46
[提交][状态][讨论版]
题目描述
贪心的MZY去一个迷宫寻宝。已知:若MZY在位置(x, y),他下一次只能移动到(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1)四个位置中的任一个(前提不能越界)。
毕竟他不是我,我可以直接飞到宝物那里去。由于MZY比较笨拙,他移动一步需要1分钟。请你帮他算出找到宝物所需要花费的最少时间。
迷宫是一个N*M的地图,图中只有四个数字。
0:此处是空的,可以走
1:此处有障碍,不可以走
2:MZY起点
3:宝物位置(只有一个宝物)
题目保证CZY至少有一条路可以到达宝物位置。
输入
输入数据有多组。
每组以两个整数N和M开始,分别表示迷宫的行数和列数,接下来N行每行有M个数。(1 <= N, M <= 10)
输出
输出MZY找到宝物的最少需要花费的时间。(以秒为单位)
样例输入
2 2
0 2
1 3
样例输出
时间限制: 1 Sec 内存限制: 128 MB
提交: 149 解决: 46
[提交][状态][讨论版]
题目描述
贪心的MZY去一个迷宫寻宝。已知:若MZY在位置(x, y),他下一次只能移动到(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1)四个位置中的任一个(前提不能越界)。
毕竟他不是我,我可以直接飞到宝物那里去。由于MZY比较笨拙,他移动一步需要1分钟。请你帮他算出找到宝物所需要花费的最少时间。
迷宫是一个N*M的地图,图中只有四个数字。
0:此处是空的,可以走
1:此处有障碍,不可以走
2:MZY起点
3:宝物位置(只有一个宝物)
题目保证CZY至少有一条路可以到达宝物位置。
输入
输入数据有多组。
每组以两个整数N和M开始,分别表示迷宫的行数和列数,接下来N行每行有M个数。(1 <= N, M <= 10)
输出
输出MZY找到宝物的最少需要花费的时间。(以秒为单位)
样例输入
2 2
0 2
1 3
样例输出
60
#include<stdio.h>
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
#define K 0xffffff
int ans[12][12],bj[12][12],mintu=K; //ans[12][12]用来构图,bj[12][12]标记走过的点;
int n,m,x2,y2,bx,by;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
struct node{
int x,y;
int tim;
}a,temp;
int jdu(struct node temp){
if(temp.x<0||temp.x>=n||temp.y<0||temp.y>=m) //判断是否越界
return 0;
if(ans[temp.x][temp.y]==1||bj[temp.x][temp.y]==-1) //判断是否已走过或是否能走
return 0;
return 1;
}
void bfs(int x1,int y1){
int i;
a.x=x1;
a.y=y1;
a.tim=0;
memset(bj,0,sizeof(bj));
queue<node>q;
bj[a.x][a.y]=-1;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
for(i=0;i<4;i++)
{
temp.x=a.x+dx[i];
temp.y=a.y+dy[i];
temp.tim=a.tim+1;
if(jdu(temp))
{
if(temp.x==bx&&temp.y==by)
{
if(mintu>temp.tim)
mintu=temp.tim; //取最小步数;
continue;
}
bj[temp.x][temp.y]=-1; //标记为走过的点;
q.push(temp);
}
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(bj,0,sizeof(bj));
mintu=K;
for(i=0;i<n;i++){
getchar();
for(j=0;j<m;j++)
{
scanf("%d",&ans[i][j]); //输入数据
if(ans[i][j]==2)
{x2=i;y2=j;} //记录起点
if(ans[i][j]==3){
bx=i;by=j; //记录终点;
}
}
}
bfs(x2,y2);
printf("%d\n",mintu*60);
}
return 0;
}