Knight Moves——双向宽搜初始值的赋法

2024-04-07 01:08

本文主要是介绍Knight Moves——双向宽搜初始值的赋法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下载LOFTER我的照片书 |
Description

Background
Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast. Can you beat him?
The Problem
Your task is to write a program to calculate the minimum number of moves needed for a knight to reach one point from another, so that you have the chance to be faster than Somurolov.
For people not familiar with chess, the possible knight moves are shown in Figure 1.
这里写图片描述

Input

The input begins with the number n of scenarios on a single line by itself.
Next follow n scenarios. Each scenario consists of three lines containing integer numbers. The first line specifies the length l of a side of the chess board (4 <= l <= 300). The entire board has size l * l. The second and third line contain pair of integers {0, …, l-1}*{0, …, l-1} specifying the starting and ending position of the knight on the board. The integers are separated by a single blank. You can assume that the positions are valid positions on the chess board of that scenario.
Output

For each scenario of the input you have to calculate the minimal amount of knight moves which are necessary to move from the starting point to the ending point. If starting point and ending point are equal,distance is zero. The distance must be written on a single line.
Sample Input

3
8
0 0
7 0
100
0 0
30 50
10
1 1
1 1
Sample Output

5
28
0
双向宽搜的时候,初始值赋成1,这样的话vis就可以!=0,最后再减掉2,因为如果起点到终点的最短路就是终点
本身,别的赋法很容易出现错误。

#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
struct node
{int x,y,step,id;
}sta,fin;
int xmov[]={-2,-1,1,2,2,1,-1,-2};
int ymov[]={1,2,2,1,-1,-2,-2,-1};
int vis[2][305][305];
int l;
int bfs()
{queue<node>Q;vis[sta.id][sta.x][sta.y]=1;vis[fin.id][fin.x][fin.y]=1;Q.push(sta);Q.push(fin);while(!Q.empty()){node v,ne;v=Q.front();Q.pop();for(int i=0;i<8;i++){ne.x=v.x+xmov[i];ne.y=v.y+ymov[i];if(ne.x<0||ne.x>=l||ne.y<0||ne.y>=l||vis[v.id][ne.x][ne.y])continue;ne.id=v.id;ne.step=v.step+1;if(vis[ne.id^1][ne.x][ne.y]!=0)return ne.step+vis[ne.id^1][ne.x][ne.y];vis[ne.id][ne.x][ne.y]=ne.step;Q.push(ne);}}return -1;
}
int main()
{int t;scanf("%d",&t);while(t--){memset(vis,0,sizeof(vis));scanf("%d",&l);scanf("%d%d",&sta.x,&sta.y);sta.step=1;sta.id=1;scanf("%d%d",&fin.x,&fin.y);fin.step=1;fin.id=0;if(sta.x==fin.x&&sta.y==fin.y)printf("0\n");elseprintf("%d\n",bfs()-2);}
}

这篇关于Knight Moves——双向宽搜初始值的赋法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881289

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

Knight Moves -uva 简单的BFS遍历

昨天刚学了BFS的遍历,在uva上找了个题敲了出来,感觉还不错,最近敲代码挺有手感的,希望这种状态保持下去 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 10 + 5#define LEN 100 + 10using namespace std;in

【CF】E. Anya and Cubes(双向DFS)

根据题意的话每次递归分3种情况 一共最多25个数,时间复杂度为3^25,太大了 我们可以分2次求解第一次求一半的结果,也就是25/2 = 12,记录结果 之后利用剩余的一半求结果 s-结果 = 之前记录过的结果 就可以 时间复杂度降低为 3 ^ (n/2+1) 题目链接:http://codeforces.com/contest/525/problem/E #include<set

【数据结构初阶】链表分类与双向带头循环链表接口实现

文章目录 1. 链表的分类2. 双向带头循环链表接口实现2. 1 结点声明2. 2 创建链表节点2. 3 初始化链表2. 4 打印链表2. 5 尾插2. 6 判空2. 7 尾删2. 8 头插2. 9 头删2. 10 查找2. 11 在指定位置删除与插入2. 12 销毁 3. 链表接口测试4. 单链表与双链表5. 顺序表与链表 1. 链表的分类 链表的结构非常多样,以下情况组合

Linux平台下利用JNI+双向RMI实现远程推送

一、 前言  作为一种优秀的编程语言,Java在许多方面具有突出的优越性。其中,RMI技术充分展现了Java卓越的分布式计算能力,而JNI技术则体现了Java结合异种编程语言的强大能力。人们常说,RMI是“从Java到Java”,这种说法忽视了这样一个事实:Java可利用JNI技术很容易地与原有系统连接。JNI+RMI的技术解决方案极大地延伸了Java的分布式功能。  本文的写作是基于这样一种实

vue3和vue2的双向绑定原理

Vue 的双向绑定是其核心特性之一,允许数据和视图之间保持同步。在 Vue 2 和 Vue 3 中,双向绑定的实现原理有所不同。以下是两者的原理对比: Vue 2 的双向绑定原理 在 Vue 2 中,双向绑定是通过以下机制实现的: 响应式系统: Vue 2 使用 Object.defineProperty 来实现响应式数据。通过在对象的每个属性上定义 getter 和 setter,Vue

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention

时序预测|变分模态分解-双向时域卷积-双向门控单元-注意力机制多变量时间序列预测VMD-BiTCN-BiGRU-Attention 文章目录 一、基本原理1. 变分模态分解(VMD)2. 双向时域卷积(BiTCN)3. 双向门控单元(BiGRU)4. 注意力机制(Attention)总结流程 二、实验结果三、核心代码四、代码获取五、总结 时序预测|变分模态分解-双向时域卷积

数据结构2 :双向链表和内核链表

1.双向链表是一种链表数据结构,其中每个节点包含三个部分:一个数据域(存储节点的数据)、一个前驱指针(指向列表中的前一个节点)和一个后继指针(指向列表中的下一个节点)。这种结构使得遍历和修改链表变得非常灵活,因为它可以从任意一个节点开始向前或向后遍历。 2.双向链表的特点      1. 双向遍历:可以从头节点遍历到尾节点,也可以从尾节点遍历到头节点。      2. 方便插入和删除:在双向

容器第四课,JDK源代码分析,自己实现LinkedList,双向链表的概念_节点定义

package com.pkushutong.Collection;public class Test03 {private Test03_01 first; //第一个节点private Test03_01 last; //最后一个节点private int size;public void add(Object obj){Test03_01 t = new Test03_01();if(fi