试题编号: | 201604-4 |
试题名称: | 游戏 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明在玩一个电脑游戏,游戏在一个n×m的方格图上进行,小明控制的角色开始的时候站在第一行第一列,目标是前往第n行第m列。 输入格式 输入的第一行包含三个整数n, m, t,用一个空格分隔,表示方格图的行数n、列数m,以及方格图中有危险的方格数量。 输出格式 输出一个整数,表示小明最快经过几个时间单位可以过关。输入数据保证小明一定可以过关。 样例输入 3 3 3 样例输出 6 样例说明 第2行第1列时刻1是危险的,因此第一步必须走到第1行第2列。 评测用例规模与约定 前30%的评测用例满足:0 < n, m ≤ 10,0 ≤ t < 99。 |
广度优先遍历可以解,最多等100分钟,1,1到n,m最多使用300分钟
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,time;
} p;
int a[105][105][2]= {0},vis[105][105][305]= {0};
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
int main()
{
int n,m,t,x,y,st,en;
scanf("%d%d%d",&n,&m,&t);
while(t--)
{
scanf("%d%d%d%d",&x,&y,&st,&en);
a[x][y][0]=st;
a[x][y][1]=en;
}
queue<node>q;
p.x=1;
p.y=1;
p.time=0;
q.push(p);
while(!q.empty())
{
p=q.front();
q.pop();
int x1,y1,time;
x=p.x;
y=p.y;
time=p.time+1;
for(int i=0; i<4; i++)
{
x1=x+dir[i][0];
y1=y+dir[i][1];
if(x1<=0||y1<=0||x1>n||y1>m||(time<=a[x1][y1][1]&&time>=a[x1][y1][0])||vis[x1][y1][time])
continue;
// cout<<x1<<" "<<y1<<" "<<time<<endl;
p.x=x1;
p.y=y1;
p.time=time;
vis[x1][y1][time]=1;
if(x1==n&&y1==m)
{
printf("%d\n",time);
return 0;
}
q.push(p);
// cout<<cnt++<<endl;
}
}
return 0;
}