最少步数

来源:互联网 发布:c语言成绩系统管理制作 编辑:程序博客网 时间:2024/06/10 03:59

最少步数

http://acm.nyist.net/JudgeOnline/problem.php?pid=58

  思路:广度优先搜索利用队列来实现

#include"stdio.h"#include"string.h"int c,d,rear=0,last=0;int q1[82]={0},q2[82]={0},v[9][9],dx[4]={-1,0,1,0},dy[4]={0,-1,0,1},flat[82]={0};int visit[9][9]={{1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,1,0,1},{1,0,0,1,1,0,0,0,1},{1,0,1,0,1,1,0,1,1},{1,0,0,0,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,1,0,0,1},{1,1,0,1,0,0,0,0,1},{1,1,1,1,1,1,1,1,1}};void bfs(int a,int b){int nx,ny,k;    q1[last]=a;  q2[last++]=b;//进队  while(rear<=last){  a=q1[rear];  b=q2[rear++];//出队             v[a][b]=1; if(a==c&&b==d){printf("%d\n",flat[rear-1]);return ;}  for(k=0;k<4;k++)  {nx=a+dx[k];ny=b+dy[k];if(nx>=0&&nx<9&&ny>=0&&ny<9&&!v[nx][ny]&&!visit[nx][ny]){                             flat[last]=flat[rear-1]+1;q1[last]=nx;        q2[last++]=ny;       //进队}  }  }  }int main(){  int a,b,n;  scanf("%d",&n);  while(n--)  {    scanf("%d%d%d%d",&a,&b,&c,&d);      memset(v,0,sizeof(v));     memset(flat,0,sizeof(flat));    rear=0;last=0;    bfs(a,b);  }return 0;}