1. 程式人生 > >SDNU OJ 1025 馬踏飛燕

SDNU OJ 1025 馬踏飛燕

該題是一道使用BFS(廣度優先搜尋)的經典題目(當然如果你不怕麻煩,DFS也是可以的), 思路很簡單,用queue存下各個情況每次都判斷是否踏到燕子,並且記得記錄深度。

Description

無聊的陶陶準備編寫一款遊戲,名字就叫做“馬踏飛燕”,在這款遊戲中有個一個100*100的座標,把馬放在任意一個座標點,再把燕子放在任意一個座標點,並且燕子不會移動,馬只能按照象棋規則走“日”。若4步之內能“踏”到燕子,則成功。笨蛋的陶陶不知道該怎麼去寫,現在請你幫助他。
走“日”說明:當馬的座標為(5,5)的時候,馬下一步可以走的座標有8個點,分別為(4,3)(6,3)(3,4)(7,4)(3,6)(7,6)(4,7)(6,7)

Input

第一行兩個整數,馬的起始座標x,y (0<x,y<100)
第一行兩個整數,燕子的座標m,n (0<m,n<100)

Output

若4步之內能“踏”到燕子,則輸出“Y”
若4步之內不能“踏”到燕子,則輸出“N”

Sample Input

5 5
7 4

Sample Output

Y

#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
​ using namespace std;
int sun[8][2] = {2,1, 2,-1, 1,2, 1,-2, -2,1, -2,-1 ,-1,2, -1,-2};//記錄下“日”的八個方向便於直接利用
bool getyan = 0;//記錄結果
bool sec[105][105];//標記是否節點是否來過
int i, j;
struct horse
{
    int heng;
    int shu;
    int step;//記錄步驟
};
void BFS(int x, int y)
{
     queue<horse> GG;
     GG.push(horse{x, y, 0});
     while(!GG.empty()){
        horse m = GG.front();
        GG.pop();
        if(sec[m.heng][m.shu] != 1){
            sec[m.heng][m.shu] = 1;
            if(m.heng == i && m.shu == j){
                getyan = 1;
                break;
            }
            for(int jump = 0;jump < 8;jump++){
                int h = m.heng + sun[jump][0];
                int s = m.shu + sun[jump][1];
                if(h <= 100 && h >= 1 && s <= 100 && s >= 1 && m.step <= 3){
                    GG.push(horse{h, s, m.step + 1});
                }
            }
        }
     }
     while(!GG.empty()) GG.pop();
}
int main()
{
    int a, b;
    while(scanf("%d %d", &a, &b) != EOF){
    scanf("%d %d", &i, &j);
    BFS(a, b);
    if(getyan) cout << 'Y' << endl;
    else cout << 'N' << endl;
    memset(sec, 0, sizeof(sec));
    getyan = 0;
    }
    return 0;
}
​

相關推薦

SDNU OJ 1025 飛燕

該題是一道使用BFS(廣度優先搜尋)的經典題目(當然如果你不怕麻煩,DFS也是可以的), 思路很簡單,用queue存下各個情況每次都判斷是否踏到燕子,並且記得記錄深度。 Description 無聊的陶陶準備編寫一款遊戲,名字就叫做“馬踏飛燕”,在這款遊戲中有個一個100

SDNU__1025.飛燕

無聊的陶陶準備編寫一款遊戲,名字就叫做“馬踏飛燕”,在這款遊戲中有個一個100*100的座標,把馬放在任意一個座標點,再把燕子放在任意一個座標點,並且燕子不會移動,馬只能按照象棋規則走“日”。若4步之內能“踏”到燕子,則成功。笨蛋的陶陶不知道該怎麼去寫,現在請你幫助他。

java實現棋盤問題

並且 mov .... i++ pan 這一 初始化 count 調用 1.問題描述:   在國際象棋中,馬走日,用戶輸入棋盤的起始位置從1-8,輸出從這一點開始,馬走完整個棋盤的各個方案,並輸出方案數 2.輸入樣式:   請輸入棋盤馬的起始位置:     1 1 3

遞推問題之過河卒問題

-a 固定 能夠 沒有 就是 數據 nbsp size turn problem 棋盤上A點有一個過河卒,需要走到目標B點。卒行走的規則:可以向下、或者向右。同時在棋盤上C點有一個對方的馬,該馬所在的點和所有跳躍一步可達的點稱為對方馬的控制點。因此稱之為“馬攔

棋盤全部解

#include"stdio.h" int a[12][12]={0};//棋盤 int cut=0;//快取馬所走的步數 long count=0;//計算有多少種踏法 void horse(int x,int y); bool walk(int index,int *x,int

棋盤超簡潔遞迴80行完成

#include<stdio.h> #include<windows.h> #define MAX 8 #define NONE 0 #define START 1 int chess[MAX][MAX]; void initchess(); void traverche

中過象棋棋盤一半 日 從(1,1)出發只能向右出,到(m,n)有多少路徑

# include<stdio.h> # include<math.h> # define M 9 # define N 5 int a[10]={1},b[10]={1},sum=0,m,p;//a[]儲存橫座標,b[]儲存縱座標 int check(int n){ i

棋盤(騎士周遊問題),深度優先搜尋

馬踏棋盤問題(又稱騎士周遊或騎士漫遊問題是演算法設計的經典問題之一)。問題描述:國際象棋的棋盤是8×8的方格棋盤,先將馬放在任意指定的方格中,按照馬走棋的規則將馬進行移動,要求每個方格只能進入一次,最終使得馬走遍棋盤的64個方格。除了邊緣的位置,馬每次有8種走法

棋盤,貪心演算法

由於回溯法實在是太耗費時間,所以利用貪心演算法進行了優化,在閱讀了網上關於貪心演算法怎麼用之後又除錯了很久,終於在上一個回溯法的基礎上寫出了優化的演算法,但是由於本人水平實在有限,程式碼或多或少還是有些問題,優化的可能還不夠。希望自己能繼續進步吧。 所謂貪心演算

一轉眼13年 14間

                一轉眼13年  馬踏14間        差不多一年的時長,很多地方變了樣,比如去年我租房子的地方,合約期滿正在轉讓,一年的時長不算長,我還沒有療好舊傷,想必很多小夥伴和我一樣念念不忘,時間走的沒有商量,全家福的照片在我眼前晃,晃的那麼蕩氣迴腸,彷彿剛剛和爸爸一起路過的池塘,經

棋盤優化

之前做了個深搜遍歷求解的方法,未優化,一個下午沒有結果,而且程式碼尚不夠精簡 看了一下優化方法,又重做了一個,基本不需要時間就能得到一個解 一共一百來行,沾沾自喜一下 #include<stdio.h> #include<windows.h>

棋盤問題

/*關於馬踏棋盤的基本過程:國際象棋的棋盤為 8*8 的方格棋盤。現將"馬"放在任意指定的方格中, 按照"馬"走棋的規則將"馬"進行移動。要求每個方格只能進入一次,最終使得"馬"走遍棋盤的64個方格。 */ #include <stdio.h> #include <time.h&g

棋盤(有問題的且不成熟的程式)

//將棋盤上的每個位置都走一遍 public class Mataqipan {          public int zou(int position[][],int m,int n,int count){

light oj 1025 - The Specials Menu(區間DP->求刪除字元使其成為迴文串的方法數)

1025 - The Specials Menu     PDF (English) Statistics Forum

棋盤-----Java版

關於馬踏棋盤的思路,大致演算法如下: 1.貪心演算法(找最少的出路,因為最少的出路往往不用進行多次選擇,貪 心演算法的主要理念是:最拿走的路是最好的路); 2.深度搜索:主要的演算法是深入進去探索,但執行時間有點長,效率有點低,但搜尋面比較廣泛; 3.回溯

棋盤演算法(騎士周遊問題)

一、馬踏棋盤演算法 1、國際象棋的棋盤為8*8的方格棋盤,將“馬”放在任意指定的方格中,按照“馬”走棋的規則將“馬”進行移動。要求每個方格只能進入一次,最終使得“馬”走遍棋盤64個方格。 2、關於國際象棋“馬”的走法:以“日”字為單位往斜對角上的那個方格走。如下圖所示馬在當

SDNU OJ 1182獎學金

用於C++中,對給定區間所有元素進行排序。標頭檔案是#include <algorithm>。 Sort函式使用模板: Sort(start,end,排序方法) Sort函式

回溯演算法之棋盤

問題描述:     在8*8國際象棋棋盤上,讓馬從某一位置開始,走“日”子型踏遍棋盤每一個格子。 演算法思想:     採用回溯演算法,在每一個點上按照一定順序探查下一步的走法,若走不動,則回溯到上一

棋盤:貪心演算法java實現

import java.util.ArrayList; import java.util.LinkedList; class Horse { private boolean board[][] = new boolean[8][8];//棋盤 private Link

棋盤C++實現與貪婪演算法優化

馬踏棋盤問題即在一個8*8的棋盤上,指定一個起點,找到一個路徑,讓棋子按照馬走日的規則將所有格子無重複的遍歷一次。 這個問題是在學習資料結構與演算法的時候看到的,當時看的是C語言的版本,也沒記住具體的解法,事後回顧起來覺得很有意思,於是自己用C++編寫了一段程式碼嘗試一下