远离远点-浙江理工大学新生赛

问题 C: 远离原点

时间限制: 1 Sec  内存限制: 128 MB

题目描述

有一个二维网格图,牛牛一开始站在原点(0,0),每一秒他可以往上下左右的某个方向移动一步,或者停留在原地
网格中有一些点是不能走的
现在问你k秒内往x方向最远能走多远,即求k秒内经过的点的最大的x坐标

输入

第一行输入两个整数n,k(0 <= n <= 47, 1 <= k <= 1000)
第二行输入n个整数x[i],表示禁走的点的x坐标 (-1000 <= x[i] <= 1000)
第二行输入n个整数y[i],表示禁走的点的y坐标 (-1000 <= y[i] <= 1000)

输出

 输出一个整数,表示k秒内经过的点的最大的x坐标

样例输入

【样例输入1】
4 4
1 1 1 1
-2 -1 0 1
【样例输入2】
4 9
-1 0 0 1
0 -1 1 0
【样例输入3】
11 47
1 0 0 -1 -1 -2 -2 -3 -3 -4 -4
0 -1 1 -2 2 -3 3 -4 4 -5 5

样例输出

【样例输出1】
2
【样例输出2】
0
【样例输出3】
31

题解:bfs搜索,可以把起点设为1000,避免为负数,当时间到时continue就行了

附上AC代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN=2000+10;
const int MAXM=100000+10;
int a[MAXN],b[MAXN];
bool pd[MAXN][MAXN];
int nx,ny,nt;
struct node
{
    int x,y,time;
}que[10000005];
int n,k;
int zb[4][2]={1,0,0,1,-1,0,0,-1}; 
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&b[i]);
        pd[a[i]+1000][b[i]+1000]=1;
    }
    int head=1;
    int tail=1;
    que[tail].x=1000;
    que[tail].y=1000;
    que[tail].time=0;
    tail++;
    pd[1000][1000]=1;
    int ans=1000;
    while(head<tail)
    {
        for(int i=0;i<4;i++)
        {
            que[tail].x=que[head].x+zb[i][0];
            que[tail].y=que[head].y+zb[i][1];
            que[tail].time=que[head].time+1;
            if(que[tail].x<0||que[tail].x>2000||que[tail].y<0||que[tail].y>2000) continue;
            if(que[tail].time>k) continue;
            if(pd[que[tail].x][que[tail].y]==1) continue;
            ans=max(que[tail].x,ans);
            pd[que[tail].x][que[tail].y]=1;
            tail++;
        }
        head++;
    } 
    cout<<ans-1000<<endl;
} 
发布了43 篇原创文章 · 获赞 12 · 访问量 3658

猜你喜欢

转载自blog.csdn.net/xzerui/article/details/88933051