试题编号: | 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。 |
//方法就是广度遍历+三维数组标记访问,其中第三维表示访问时间
#include<iostream>
#include<queue>
using namespace std;
typedef struct Node{
int x,y,step;
}Node;
int vis[105][105][305]={0};//注意要使第三维尽可能的大
queue<Node> q;
int main(){
int n,m,t;
int r,c,a,b;
cin>>n>>m>>t;
while(t--){
cin>>r>>c>>a>>b;
for(int i=a;i<=b;i++){
vis[r][c][i]=1;
}
}
int dir[4][2]={1,0,-1,0,0,1,0,-1};
Node node;
node.x=1;node.y=1;node.step=0;
q.push(node);
while(!q.empty()){
node=q.front();
q.pop();
int x=node.x,y=node.y,step=node.step;
if(x==n && y==m){
cout<<step;
return 0;
}
for(int i=0;i<4;i++){
int xx=x+dir[i][0],yy=y+dir[i][1],ss=step+1;
if(xx>0 && xx<=n && yy>0 && yy<=m && vis[xx][yy][ss]==0){
Node temp;
temp.x=xx;temp.y=yy;temp.step=ss;
q.push(temp);
vis[xx][yy][ss]=1;
}
}
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答