POJ3021

来源:互联网 发布:windows git 自动更新 编辑:程序博客网 时间:2024/05/20 01:13
/*题意:一个人从原点出发,要到距离原点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);}}
原创粉丝点击