远离原点
题目描述有一个二维网格图,牛牛一开始站在原点(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坐标
链接: http://47.96.116.66/problem.php?id=1828
样例输入【样例输入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
思路:先对输入的数据预处理,因为数组没有负的下标,所以将横坐标和纵坐标都加1500,整体平移,在用bfs广搜进行寻找最大的x。
c++代码如下:
// An highlighted block
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int dis[2][10]={{1,-1,0,0},{0,0,1,-1}};
int k,bj[3000][3000],ans,x[100000],y[100000];
int ok(int a,int b){
if(bj[a][b])
return 0;
else
return 1;
}
void bfs(int a,int b){
int i,j,head=1,tail=1,q,s,z=1;
x[1]=1500;
y[1]=1500;
bj[1500][1500]=1;
for(i=1;i<=k;i++)
{
for(j=head;j<=tail;j++)
{
for(q=0;q<=3;q++)
{
if(ok(x[j]+dis[0][q],y[j]+dis[1][q]))
{
z++;
x[z]=x[j]+dis[0][q];
y[z]=y[j]+dis[1][q];
bj[x[z]][y[z]]=1;
if(x[z]>ans)
ans=x[z];
}
}
}
head=tail+1;
tail=z;
}
}
int main()
{
int n,i,a[100],b[100];
cin>>n>>k;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=n;i++)
cin>>b[i];
for(i=1;i<=n;i++)
bj[a[i]+1500][b[i]+1500]=1;
ans=1500;
bfs(1500,1500);
cout<<ans-1500<<endl;
return 0;
}