相应的问题所在:http://acm.pku.edu.cn/JudgeOnline/problem?id=1915

C语言版实现算法如下:

 

#include<stdio.h>

int tu[1000][1000];

int head,tail,count,m,flag=0,EndX,EndY;

struct save {
 int x;
 int y;
 
 
}data[900000];      

void DFS( int x, int y,int times)     // x,y当前所在位置的步数, times 走到当前位置所走的步数;
{
  if(x==EndX&&y==EndY)
      {
           flag=1;
            return;
     } 
   

 if(x-2>=0&&y+1<m&&tu[x-2][y+1]==-1)//向右上方
 {
  data[tail].x=x-2;
  data[tail].y=y+1;//进队列
     tu[x-2][y+1]=times+1;
  tail++;
  
 }

 if(x-2>=0&&y-1<m&&tu[x-2][y-1]==-1)//向左上方
 {
  data[tail].x=x-2;
  data[tail].y=y-1;//进队列
  tu[x-2][y-1]=times+1;
  tail++;
  
 }

 

  if(x-1>=0&&y+2<m&&tu[x-1][y+2]==-1)//向右偏上方
 {
  data[tail].x=x-1;
  data[tail].y=y+2;//进队列
  tu[x-1][y+2]=times+1;
  tail++;
 
 }


  if(x-1>=0&&y-2<m&&tu[x-1][y-2]==-1)//向左偏上方
 {
  data[tail].x=x-1;
  data[tail].y=y-2;//进队列
     tu[x-1][y-2]=times+1;
  tail++;
 
 }

 if(x+2>=0&&y+1<m&&tu[x+2][y+1]==-1)//向右下方
 {
  data[tail].x=x+2;
  data[tail].y=y+1;//进队列
        tu[x+2][y+1]=times+1;
  tail++;
 
 }

 if(x+2>=0&&y-1<m&&tu[x+2][y-1]==-1)//向左下方
 {
  data[tail].x=x+2;
  data[tail].y=y-1;//进队列
  tu[x+2][y-1]=times+1;
  tail++;

 }

 if(x+1>=0&&y+2<m&&tu[x+1][y+2]==-1)//向右偏下方
 {
  data[tail].x=x+1;
  data[tail].y=y+2;//进队列
        tu[x+1][y+2]=times+1;
  tail++;

 }

  if(x+1>=0&&y-2<m&&tu[x+1][y-2]==-1)//向左偏下方
 {
  data[tail].x=x+1;
  data[tail].y=y-2;//进队列
        tu[x+1][y-2]=times+1;
  tail++;
 
 }
 
}

 main()
{
 int n,i,j,x,y;
 scanf("%d",&n);
 while(n!=0)

 {
 head=0;
 tail=0;
    count=0;
 flag=0;
 scanf("%d",&m);

  
  
  for(i=0;i<m;i++)
  for(j=0;j<m;j++)  
   tu[i][j]=-1;  
 

  scanf("%d%d",&x,&y);
  tu[x][y]=0;
  scanf("%d%d",&EndX,&EndY);
  data[tail].x=x;
  data[tail].y=y;
  tail++;
  while(tail>head&&flag!=1)      //当队列不为空且没有找到目的点;
  {
  

   DFS(data[head].x,data[head].y,tu[data[head].x][data[head].y]);  //从当前点开始进行广度遍历;
   if(flag==1)
   {
    count=tu[EndX][EndY];
    printf("%d\n",count);           // 直到找到目的点后输出步数;
    break;
   }
   head++;
  
  }
  n--;
 }
  return 0;
}
  

 

 

 

通过二维数组,队列等存储结构完成图的广度遍历功能。

posted on 2010-03-06 23:42  KuSiuloong  阅读(253)  评论(0编辑  收藏  举报