问题 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; }