題目描述
小 b 最近迷上了華容道,可是他總是要花很長的時間才能完成一次。於是,他想到用程式設計來完成華容道:給定一種局面,華容道是否根本就無法完成,如果能完成,最少需要多少時間。
小 b 玩的華容道與經典的華容道遊戲略有不同,遊戲規則是這樣的:
在乙個 n*m 棋盤上有 n*m 個格仔,其中有且只有乙個格仔是空白的,其餘 n*m-1個格仔上每個格仔上有乙個棋子,每個棋子的大小都是 1*1 的;
有些棋子是固定的,有些棋子則是可以移動的;
任何與空白的格仔相鄰(有公共的邊)的格仔上的棋子都可以移動到空白格仔上。 遊戲的目的是把某個指定位置可以活動的棋子移動到目標位置。
給定乙個棋盤,遊戲可以玩 q 次,當然,每次棋盤上固定的格仔是不會變的,但是棋盤上空白的格仔的初始位置、指定的可移動的棋子的初始位置和目標位置卻可能不同。第 i 次玩的時候,空白的格仔在第 ex_i 行第 ey_i 列,指定的可移動棋子的初始位置為第 sx_i 行第 sy_i 列,目標位置為第 tx_i 行第 ty_i 列。
假設小 b 每秒鐘能進行一次移動棋子的操作,而其他操作的時間都可以忽略不計。請你告訴小 b 每一次遊戲所需要的最少時間,或者告訴他不可能完成遊戲。
樣例輸入
3 4 2
0 1 1 1
0 1 1 0
0 1 0 0
3 2 1 2 2 2
1 2 2 2 3 2
樣例輸出
2 -1
資料範圍
考慮一下,白色格仔怎麼移動會對答案有利。
首先,只有白色格仔才能夠帶動指定棋子的移動,因此,先暴力出把白色格仔轉移到指定棋子的四周最短距離。
然後,我們設個狀態
f [i][j][k]表示當前指定棋子的位置為(i
,j),
k 表示白色格仔在指定棋子的哪個方向(上下左右四個位置,k=
1 or 2 or 3 or 4)。很明顯,指定棋子與白色空格交換後,會變成與
k 相反的方向,(例如,方向左會變成方向右)位置也會有所發生改變。
但是如果一直只與空格交換是沒有意義的,所以,我們還要試著把空格的位置轉移到其它三個方向的位置上去,這樣子轉移就完美了。對於從乙個方向轉移另乙個方向,我們可以暴力預處理。
zy[i][j][k][l]表示當指定棋子在(i
,j),從
k 方向轉移到
l方向的最短距離(即最少時間)。對於這個我們可以暴力處理(不會超時),但是要注意,在轉移空格的同時,空格不能走到(i
,j) (即不能與指定棋子交換)。有了預處理,轉移就很輕鬆了。
還有,別忘了初始化。
以及無解的情況(輸出-1)。
最後答案就是mi
n (f[tx][ty][1],f[tx][ty][2],f[tx][ty][3],f[tx][ty][4])。
Noip2013提高組day2 花匠
我們把原序列大概抽象在函式圖上,就會得出這樣的結果 如下圖 顯然,圈出來的點就是我們要保留的,不可能存在刪掉一大段會存在更優的情況。做法就是每次順著找乙個最高的點,再找乙個最低的點,如果存在相同的則視為乙個點。include include include define fo i,j,k for i...
NOIP2013提高組 day2 花匠
這道題是dp,但是寫錯了,還是貪心簡單,而且快 仔細觀察可以發現兩個條件其實意思就是這一排花最後要成波浪狀 那我們o n 跑一遍就好了,就像把目前的花接到序列中去 根據序列目前的上公升下降判斷長度是否有增加 如果改變了增減性,ans 如果沒有改變,目前的這盆花肯定更優,雖然不加長度,但是要更新序列的...
NOIP2013提高組 day2 積木大賽
這道題正解是dp或是貪心,本寶用的是模擬,神奇的過了喲 先sort一下從大到小,因為我們可以看成在疊最高的那個時,順便完成了與它相鄰的一些 具體實現請手打,描述太麻煩啦 我們這樣處理就能快很多,可能是資料不是很強,其實還是蠻快的 雖然沒有o n 快 include include include i...