Serendipity丶


私信TA

用户名:uq_38590416266

访问量:2433

签 名:

别人的屋檐再大,不如自己手中有伞

等  级
排  名 64
经  验 10627
参赛次数 0
文章发表 33
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

唯有提高自己的核心竞争能力,才可在逆流中不断前进。

解题思路:讲一遍可以走的全部走完 理解后特别简单 

注意事项:

参考代码:

#include

using namespace std;

int dx[]={1,1,-1,-1,2,2,-2,-2};

int dy[]={2,-2,2,-2,1,-1,1,-1};//方向数组 

int a[305][305]={0}//标记

int step[305][305]={0};//步数 

int m,n,x2,y2;//起始点和终点 

int h;

void dfs(int m,int n)

{

queue

x.push(m),y.push(n);

step[m][n]=0;//刚开始步数为0 

a[m][n]=1;//标记 

while(!x.empty())//结束条件 

{

int tx=x.front(),ty=y.front();//找出点 

if(tx == x2 && ty == y2)

{

cout << step[tx][ty] << endl;//找到输出并结束

break;

}

x.pop(),y.pop();//跳出队列 

for(int i=0;i<8;i++)

{

int sx = tx +dx[i],sy = ty + dy[i];

if(a[sx][sy] == 0 && sx>=0 && sy>=0 && sx<=h && sy<=h)//看是否标记和出棋盘 

{

x.push(sx);

y.push(sy);//入队 

a[sx][sy]=1;//标记 

step[sx][sy]=step[tx][ty]+1;//上一步加1 

}

}

}

}

int main()

{

   int k;

   cin >> k;

   for(int i = 0 ;i< k ;i++)

   {

    cin >> h;

    cin >> m >> n >> x2 >> y2;

    if(m == x2 && n == y2)

    {

    printf("0\n"); 

    continue;

   }

    else dfs(m,n);

memset(step,0,sizeof(step));

memset(a,0,sizeof(a));//重置为0 

   }

return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »