騎士問題 廣搜

2021-07-11 23:58:18 字數 1392 閱讀 8435

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

描述小hi:小ho你會下西洋棋麼?

小ho:應該算會吧,我知道每個棋子的移動方式,馬走日象飛田什麼的…

小hi:象飛田那是中國象棋啦!

小ho:哦,對。西洋棋好像是走斜線來著。

小hi:不過馬走日倒是對了。西洋棋中的馬一般叫做騎士,關於它有個很有意思的問題。

小ho:什麼啊?

小hi:騎士巡遊問題,簡單來說就是關於在棋盤上放置若干個騎士,然後**移動這些騎士是否能滿足一定的而要求。舉個例子啊:乙個騎士從起始點開始,能否經過棋盤上所有的格仔再回到起點。

小ho:哦,看上去好像很難的樣子。

小hi:其實也還好了。簡單一點的比如棋盤上有3個騎士,能否通過若干次移動走到一起。

小ho:能夠麼?

小hi:當然能夠了。由於騎士特殊的移動方式,放置在任何乙個初始位置的騎士,都可以通過若干次移動到達棋盤上任意乙個位置。

小ho:那麼只要選定乙個位置,把它們全部移動過去就好了是吧?

小hi:是的,那麼這裡又有另乙個問題了:要選擇哪乙個位置匯合,使得3個騎士行動的總次數最少?

小ho:嗯,這個好像不是很難,讓我想一想。

輸入第1行:1個正整數t,表示資料組數,2≤t≤10。

第2..t+1行:用空格隔開的3個座標, 每個座標由2個字元ab組成,a為』a』~』h』的大寫字母,b為』1』~』8』的數字,表示3個棋子的初始位置。

輸出第1..t行:每行1個數字,第i行表示第i組資料中3個棋子移動到同一格的最小行動步數。

樣例輸入

2 a1 a1 a1

b2 d3 f4

樣例輸出 0 2

#include "iostream"

#include "stdio.h"

#include "queue"

#include "utility"

#include "string.h"

using

namespace

std;

int t;

int initx[10];

int inity[10];

int step[4][9][9];

queue

< pair > q;

const

int dx = ;

const

int dy = ;

void bfs(int k, int x, int y)}}

}int solve()

return min;

}int main()

cout

<< solve() << endl;

}return

0;}

BFS(廣搜) 騎士旅行

ssl 1456 題目描述 在乙個n m 格仔的棋盤上,有乙隻西洋棋的騎士在棋盤的左下角 1 1 騎士只能根據象棋的規則進行移動,要麼橫向跳動一格縱向跳動兩格,要麼縱向跳動一格橫向跳動兩格。例如,n 4,m 3 時,若騎士在格仔 2 1 則騎士只能移入下面格仔 1 3 3 3 或 4 2 對於給定正...

SCOI2005 騎士精神 雙向廣搜

目錄 一.雙向bfs 1.引入 2.概念 3.偽板子及解釋 4.運用hash進行標記 二.引入一道不太難的題目 1.題目 2.解題思路 3.如果還不懂,可供參考 謝謝!廣搜這種東西相信大家都很熟悉吧,相信曾經想剪枝也是快想禿頭了吧。雙向bfs正是一種很好的優化方法。它可以將時間複雜度折半。一般的bf...

迷宮問題 廣搜

定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...