64.广搜练习跳马问题

64.广搜练习跳马问题

64.广搜练习跳马问题
代码:
#include
using namespace std;
#include
#include
#define INF 101
int can[101][101];//1 wei ke zou,存是否可走2 
int dis[101][101];//存距离 
int dl1[101],dl2[101];
int xx[]={-2,-2,2,2,1,-1,1,-1};
int yy[]={1,-1,1,-1,2,2,-2,-2};
int n,x,y;
void input()
{
scanf("%d",&n);
scanf("%d%d",&x,&y);
for(int i=1;i<=n;++i)
 for(int j=1;j<=n;++j)
 {
  scanf("%d",&can[i][j]);//1 shi ke zou
 }
}
void BFS()
{
memset(dis,-1,sizeof(dis));//memset函数赋初值,只有0和-1是对应的,别的数就不是了 
int head=0,tail=0;
++tail;
dl1[1]=x;
dl2[1]=y;
dis[x][y]=0;
while(head
{
++head;
int x0=dl1[head],y0=dl2[head];
for(int i=0;i<8;++i)
{
int x1=x0+xx[i],y1=y0+yy[i];
if(x1>=1&&x1<=n&&y1>=1&&y1<=n&&can[x1][y1]==1&&dis[x1][y1]==-1)//赋初值为-1,是处理走不到的点 
{
++tail;
dis[x1][y1]=dis[x0][y0]+1;
dl1[tail]=x1;
dl2[tail]=y1;
}
}
}
}
void out()
{
for(int i=1;i<=n;++i)
 {
  for(int j=1;j<=n;++j)
       printf("%d ",dis[i][j]);
  printf(" ");  
      }
}
int main()
{
input();
BFS();
out();
return 0;
}

原文地址:https://www.cnblogs.com/csgc0131123/p/5290335.html