poj 1324 狀態廣搜

2022-07-28 20:51:27 字數 1353 閱讀 1331

其實就是我們經常玩的貪吃蛇。

不過現在我們優先蛇的頭的話,要用乙個巧妙的雜湊來把蛇的身體表達出來,那麼就可以用乙個4進製的數字來表示,蛇的身體長度最多不超過8,所以最多是2^7種狀態。

1 #include2 #include3 #include4 #include5 #include6

intconst n = 8;7

intconst m = 22;8

intconst state = 17000;9

struct

snake

10cur,nt;

14 snake q[1000000

];15

inthead,tail;

16int

n,m,l,x,y,ans,s;

17bool

map[m][m],vis[m][m][state];

18int dirx=;

19int diry=;

20bool judge(int x,int

y)21

24int check(int x1,int y1,int x2,int

y2)25

33else

3440}41

intbfs()

4266

if(f)continue;67

for(int j=l-1;j>0;j--)

68 nt.bx[j]=cur.bx[j-1],nt.by[j]=cur.by[j-1

];69

int state=0;70

for(int j=0;j1;j++)

71 state=state*4+check(nt.bx[j],nt.by[j],nt.bx[j+1],nt.by[j+1

]);72

if(!vis[nt.bx[0]][nt.by[0

]][state])

7377}78

}79return -1;80

}81intmain()

8293

for(int i=0;i)

94 scanf("

%d %d

",&cur.bx[i],&cur.by[i]);

95 scanf("

%d",&s);

96for(int i=0;i)

97101 printf("

case %d: %d\n

",++t,bfs());

102}

103return0;

104 }

view code

POJ 1324(A 狀態壓縮)

真是好題啊,各種tle之後看了人家的解題報告才a的 1 一開始用deque儲存狀態資訊,用queue進行bfs,tle 2 試圖用陣列儲存狀態資訊,自己寫佇列進行bfs,還是tle 3 由於row和col都小於20,試圖用5 2個bit表示乙個位置,還是tle 終於看了discuss,找到了大牛的解...

POJ1376簡單廣搜

題意 給你乙個n m的矩陣,然後給你機械人的起點和終點,還有起點的方向,然後每次機械人有兩種操作,左右旋轉90度,或者是朝著原來的方向走1,2或者3步,機械人再走的過程中不能碰到格仔,也不能碰到邊界,輸出最少步數。思路 比較簡單的題目,只是要注意幾點。1 走的過程中邊界不可以碰 2 如果你想一下子走...

POJ 3278 簡單廣搜

poj3278 題意 輸入n,m,求由n到m需要最少步數,n只能加一減一或者乘二。寫的第二道廣搜題,發現用佇列就是每一種可能讀入隊尾,然後再從隊首乙個乙個的遍歷。需要做的是判斷條件和記錄步數。includeusing namespace std include include include def...