/*题意:一个人从原点出发,要到距离原点s的位置,
给出m个每一步能走的坐标位置,问是否可以到达S;
如果能,输出最小步数,如果不能,输出impossible
*/
/*题解:用广搜,把表示方向的坐标换成题目给出的(X,Y)
然后比较走过的距离和给出的需要到达的位置*/
#include<stdio.h>
#include<string.h>
#include<queue>
#include<math.h>
#include<algorithm>
using namespace std;
int m,s,k,flag;
int xi[330];
int yi[330];
int book[330][330];
struct data //定义结构体,方向(X,Y)步数S,走过的长度l;
{
int x;
int y;
int s;
double l;
};
void bfs(int x,int y,int step,double l)
{
queue<data>Q; //队列
data now,temp; //结构体变量
now.x = x;
now.y = y;
now.s = step;
now.l = 0;
book[x][y] = 1;
Q.push(now);
while(!Q.empty())
{
now = Q.front();
Q.pop();
if(now.l == s*s) //比较走过的距离,和要到达的目的地的距离
{
printf("%d\n",now.s);
flag = 1;
break;
}
for(int i=0; i<m; i++)
{
int dx = now.x + xi[i]; //计算X方向走过的长度
int dy = now.y + yi[i]; //计算Y方向走过的长度
int dl = (dx*dx) + (dy*dy); //距离原点的距离
if(dx >= 0 && dy >= 0 && dl <= s*s)
{
if(!book[dx][dy])
{
book[dx][dy] = 1;
temp.x = dx;
temp.y = dy;
temp.l = dl;
temp.s = now.s+1;
Q.push(temp);
}
}
}
}
if(flag == 0)
printf("not possible\n");
}
int main()
{
int r;
scanf("%d",&r);
while(r--)
{
scanf("%d %d",&m,&s);
for(int i=0; i<m; i++)
scanf("%d %d",&xi[i],&yi[i]);
memset(book,0,sizeof(book)); //数组清零
bfs(0,0,0,0);
}
}
POJ3021
最新推荐文章于 2020-03-28 12:05:48 发布