POJ3322滾箱子遊戲(不錯)

2021-06-28 12:33:25 字數 2653 閱讀 1461

題意:

講的是乙個遊戲,就是在乙個平面上滾動乙個1*1*2的長方體的遊戲,在本題裡面的遊戲規則是這樣的:

(1)一開始給你箱子的狀態,可能是橫著也可能是豎著。

(2)每一次可以滾動箱子,但是每次滾動到的位置(1個或者2個)都必須不能是空的。

(3)有的位置只能經得起箱子一半的重量,有的能經得起真個箱子的重量,經得起一半的格仔意思就是不能在當前的這個格仔上吧箱子豎起來。

(4)然後問從起始狀態到掉到終點給的洞裡面的最小步數,掉到洞裡面的時候必須是豎直掉下去的。

思路:比較明顯可以用搜尋來做,但是這個題目的關鍵點是如何標記狀態,我的做法是對於每乙個點都有五個狀態,就是另乙個點相對於這個點的位置,可以是東南西北,還有正上方

,標記的時候是這樣的依靠五個狀態,搜尋的時候為了簡化**我寫的是3個狀態的,因為有一些等效狀態,我們只要搜尋其中的乙個就行了,但是如果你願意把所有的狀態都寫出來,那麼一共是5種,每種有四個方向的走法一共是5*4種選擇,這樣**量估計比較大,如果是相等狀態只進乙個的話可以達到3*4種選擇,但是這樣的話要注意就是在mark的時候的一些細節,別的沒啥的就是簡單廣搜,姿勢好點應該沒啥大問題,具體細節可以看下面**。

#include

#include

#include

using namespace std;

typedef struct

node;

node xin ,tou;

int map[505][505] ,n ,m;

int mark[505][505][5];

int ex ,ey;

bool ok(int x ,int y ,int k)

int bfs()

//下x1.x = tou.x + 1 ,x1.y = tou.y ,x1.k = 3;

x2.x = tou.x + 2 ,x2.y = tou.y ,x2.k = 1;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

//左x1.x = tou.x ,x1.y = tou.y - 1 ,x1.k = 4;

x2.x = tou.x ,x2.y = tou.y - 2 ,x2.k = 2;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

//右x1.x = tou.x ,x1.y = tou.y + 1 ,x1.k = 2;

x2.x = tou.x ,x2.y = tou.y + 2 ,x2.k = 4;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

}else if(tou.k == 1)

//下x1.x = tou.x + 1 ,x1.y = tou.y ,x1.k = 0;

if(ok(x1.x ,x1.y ,x1.k) && map[x1.x][x1.y] == 1)

//左x1.x = tou.x ,x1.y = tou.y - 1 ,x1.k = 1;

x2.x = tou.x - 1 ,x2.y = tou.y - 1 ,x2.k = 3;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

//右x1.x = tou.x ,x1.y = tou.y + 1 ,x1.k = 1;

x2.x = tou.x - 1 ,x2.y = tou.y + 1 ,x2.k = 3;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

}else if(tou.k == 4)

//下x1.x = tou.x + 1 ,x1.y = tou.y ,x1.k = 4;

x2.x = tou.x + 1 ,x2.y = tou.y - 1 ,x2.k = 2;

if(ok(x1.x ,x1.y ,x1.k) && ok(x2.x ,x2.y ,x2.k))

//左x1.x = tou.x ,x1.y = tou.y - 2 ,x1.k = 0;

if(ok(x1.x ,x1.y ,x1.k) && map[x1.x][x1.y] == 1)

//右x1.x = tou.x ,x1.y = tou.y + 1 ,x1.k = 0;

if(ok(x1.x ,x1.y ,x1.k) && map[x1.x][x1.y] == 1)}}

return -1;

}int main ()

else if(str[j-1] == 'o')

else if(str[j-1] == 'e') map[i][j] = 2;

else if(str[j-1] == '#') map[i][j] = 0;

else map[i][j] = 1;}}

if(s == 1) xin.x = sx1 ,xin.y = sy1 ,xin.k = 0 ,xin.t = 0;

else

int ans = bfs();

ans == -1 ? printf("impossible\n") : printf("%d\n" ,ans);

}return 0;

}

SDUT 3322 收索 打表

一下迭代序列定義在整數集合上 n n 2 n 是偶數 n n 3 1 n 是奇數 應用以上規則,並且以數字13 開始我們得到一下序列 13,40,20,10,5,16,8,4,2,1 可以看出這個以13 開始以1 結束的序列一共經過了 9次運算。雖然還沒有被證明 collatz問題 但是人們認為在這...

bzoj3322 最大生成樹 LCA

題目大意 給個無向圖,每條邊有個限制,每個點最多能 和賣出一定 然後按順序走過n個點,求每個賣出 的點最多能賣出多少 一開始有點懵,想著怎麼再圖上做這個問題,後來知道要先建一棵最大生成樹 然後就好做了,做的時候 全都拿,不必考慮第乙個條件,因為就算花不完也能在之前某個地方少買一點 然後沒個詢問找前後...

3322網域名稱重置任意使用者密碼的漏洞

3322網域名稱找回密碼時可以重置任意使用者的密碼。找回密碼功能傳送到email中的驗證碼和cookie中的乙個值繫結,未和需要找回的使用者名稱繫結,導致可用a郵箱中的驗證碼,驗證找回任意使用者。找回密碼時看了下,出現如圖這麼乙個token,直覺告訴我,這個發過去的驗證碼和cookie繫結了 於是,...