POJ1915 Knight Moves(宽搜经典题目)

来源:互联网 发布:python教程 图灵 编辑:程序博客网 时间:2024/05/17 02:01

题目描述:在国际象棋当中,给定一个起点和终点,请问一个马走的最短路径是多少。(求最短路径一般用宽搜,求能否达到用深搜)

#include<stdio.h>#include<queue>#include<string.h>#define Max 310using namespace std;struct Node{int x,y;int step;Node(int xx,int yy,int s):x(xx),y(yy),step(s){}};int size;int si,sj;int di,dj;int ans;int flag[Max][Max];//标记重复扩展的节点int dir[8][2]={{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1},{2,1},{1,2}};void fun(){queue<Node> a;a.push(Node(si,sj,0));flag[si][sj]=1;while(!a.empty()){Node temp=a.front();if(temp.x==di&&temp.y==dj)    {    ans=temp.step;return;    }else{  for(int i=0;i<8;i++)  {  int Ni=temp.x+dir[i][0];  int Nj=temp.y+dir[i][1];if(Ni<0||Nj<0||Ni>=size||Nj>=size||flag[Ni][Nj]==1)  continue;  a.push(Node(Ni,Nj,temp.step+1));  flag[Ni][Nj]=1;  }    a.pop();}}}int main(){      int Case;   scanf("%d",&Case);   while(Case--)   {      memset(flag,0,sizeof(flag));    scanf("%d",&size);    scanf("%d%d%d%d",&si,&sj,&di,&dj); fun();    printf("%d\n",ans);   }return 0;}


0 0