lca 學長出的我省省選的神仙題目 省強我菜系列
loj3399
我可能說不清楚,對著**理解吧 …… 感覺這題的主要難點是:不要想他具體是怎麼操作的,只要知道他一定存在一種操作方式能夠實現就行了。
首先要注意到乙個很重要的性質:對於當前空格所在的點,除非這個點在目標中就是空格,否則一定可以通過一步操作使這個點變得和目標中一樣(下稱「變得和目標中一樣」為「歸位」)。例如,如果這個點最終是朝上的(意思是這個點是乙個上下方向的塊的下半部分,朝下、朝左、朝右同理),那麼無論它上面是乙個朝上還是朝左還是朝右(顯然不可能朝下)的塊,都可以通過移動它上面的塊來使這個點變得朝上。這樣只需要不斷地通過這種操作使空格所在的塊歸位,就可以讓空格到達目標中的空格的位置。
但是,這個過程中不能保證訪問到了所有格仔,所以有些未歸位的格仔可能沒有被發現。因此在把空格歸位後要去主動尋找未歸位的格仔。具體方法是用 dfs 主動尋找未歸位的格仔。雖然這樣會讓已經歸位的格仔變成未歸位,但是回溯的時候挪回去就行了。每找到乙個未歸位的格仔就像上一段描述的一樣使它歸位,直到空格又回到 dfs 找到的這個地方。如此把所有格仔都 dfs 一遍,就能讓所有格仔歸位。
#include #include #include using namespace std;
namespace zyt
, dy = ;
const char opt = , ch = ;
char a[n][n], b[n][n], ans[m];
bool vis[n][n];
int cntans, n, m, dir[ch];
void move(const int d, int &x, int &y)
void go(int &x, int &y, const int x1, const int y1)
void dfs(int x, int y)
vis[x1][y1] = true;
int dd = dir[a[x1][y1]];
move(d, x, y);
dfs(x, y);
move(dd ^ 1, x, y);
} }int work()
go(x, y, x1, y1);
dfs(x, y);
printf("%s", ans);
return 0; }}
int main()
Loj 2256 SNOI2017 英雄聯盟
題目 我就是個絲薄 如果要用 dp i 表示湊出 i 的最小花費顯然不可能的 之後大力猜想能湊出來的狀態不會很多,我的暴力也告訴我不是很多,好像也確實不多的樣子,大概 4e4 左右 但是我就這樣思維僵化了,揹包套路難道不是看到某一維特別大就把交換一下這一維和 dp 值嗎 於是 dp i 表示使用 i...
SNOI2019 紙牌(麻將DP)(矩陣快速冪)
今年省選好多麻將dp。說的是紙牌,但是寫過麻將dp的都知道這是麻將dp的乙個套路。以下把三張連著的牌叫做順子,三張相同的牌叫做刻子。不允許同型別順子出現超過兩次,否則我們可以用三個刻子來換掉。實際上我們發現影響我們用多少張i ii牌的只有前面的i 2 i 1 i 2,i 1 i 2,i 1開頭的順子...
SNOI2019 字串題解
目錄code 洛谷p5329 題目意思很明確,但似乎不太好求。還是先看看部分分。theta n 2 log n 暴力,先得10分。發現一件事,在比較 s i 和 s j 時,假設 i,從1到i 1這一段是一樣的,從j 1到n是一樣的,所以我們只要比較原串的i 1 j和i j 1這兩段就行。由於任意相...