洛谷 P1979 華容道

2021-07-23 21:32:47 字數 1510 閱讀 3556

題目描述

小 b 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用程式設計來完成華容道:給定一種局面, 華容道是否根本就無法完成,如果能完成, 最少需要多少時間。

小 b 玩的華容道與經典的華容道遊戲略有不同,遊戲規則是這樣的:

在乙個 n*m 棋盤上有 n*m 個格仔,其中有且只有乙個格仔是空白的,其餘 n*m-1個格仔上每個格仔上有乙個棋子,每個棋子的大小都是 1*1 的;

有些棋子是固定的,有些棋子則是可以移動的;

任何與空白的格仔相鄰(有公共的邊)的格仔上的棋子都可以移動到空白格仔上。

遊戲的目的是把某個指定位置可以活動的棋子移動到目標位置。

給定乙個棋盤,遊戲可以玩 q 次,當然,每次棋盤上固定的格仔是不會變的, 但是棋盤上空白的格仔的初始位置、 指定的可移動的棋子的初始位置和目標位置卻可能不同。第 i 次

玩的時候, 空白的格仔在第 exi 行第 eyi 列,指定的可移動棋子的初始位置為第 sxi 行第 syi列,目標位置為第 txi 行第 tyi 列。

假設小 b 每秒鐘能進行一次移動棋子的操作,而其他操作的時間都可以忽略不計。請你告訴小 b 每一次遊戲所需要的最少時間,或者告訴他不可能完成遊戲。

【題目分析】

bfs+spfa

【**】

#include 

#include

#include

#include

#include

#include

using namespace std;

const int inf=0x3f3f3f3f;

intmap[31][31];

int hash[31][31][4],cnt=0;

int mov[4][2]=,,,};

int h[4000001],ne[4000001],to[4000001],w[4000001],en=0;

int dis[3601],inq[3601];

int vis[31][31];

int n,m,que;

int ex,ey,fx,fy,tx,ty;

struct node;

void add(int a,int b,int c)

int bfs(int fx,int fy,int tx,int ty,int bx,int by)

}return inf;

}int spfa(int ex,int ey,int fx,int fy,int tx,int ty)

while (!q.empty())}}

}int ans=inf;

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

if (hash[tx][ty][k])

ans=min(ans,dis[hash[tx][ty][k]]);

return ans==inf?-1:ans;

}int main()

}

洛谷P1979 華容道(70分 暴力)

問題描述 小 b 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用程式設計來完成華容道 給定一種局面,華容道是否根本就無法完成,如果能完成,最少需要多少時間。小 b 玩的華容道與經典的華容道遊戲略有不同,遊戲規則是這樣的 在乙個 n m 棋盤上有 n m 個格仔,其中有且只有乙...

P1979 華容道 spfa題解

問題描述 小 b 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用程式設計來完成華容道 給定一種局面,華容道是否根本就無法完成,如果能完成,最少需要多少時間。小 b 玩的華容道與經典的華容道遊戲略有不同,遊戲規則是這樣的 在乙個 n m 棋盤上有 n m 個格仔,其中有且只有乙...

題解 P1979 華容道 Noip2013

小 b 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用程式設計來完成華容道 給定一種局面,華容道是否根本就無法完成,如果能完成,最少需要多少時間。小 b 玩的華容道與經典的華容道遊戲略有不同,遊戲規則是這樣的 在乙個 n mn times mn m 棋盤上有 n times ...