HDU 1401 Solitaire(雙向廣搜)

2021-10-04 09:16:05 字數 2593 閱讀 9791

第一次做雙向廣搜,這花的時間真是夠久的。

看別人部落格,在知道要把棋子排序之後思路就很清晰了,但是**實現不了…

原因是我把一對中間變數放到迴圈外面了還看不出來!

而且在**只相差變數名字的時候,複製完了總忘記改名字!

細心啊,細心啊!不耐心一點好好地寫**才會浪費更多的時間!!!

這個悲慘的故事教會我,能直接給目標變數做修改就別通過中間變數來實現。

此題還讓我還學會了減小空間可以用char型別來儲存標記。

**如下:

#include

#include

#include

#include

#include

using

namespace std;

typedef pair<

int,

int> pii;

const

int dr=

;const

int dc=

;char visited[8]

[8][

8][8

][8]

[8][

8][8

];setss;

bool

check

(int x,

int y)

struct cnode

;struct node

;bool

cmp(

const cnode& p1,

const cnode& p2)

void

push

(const cnode p[4]

,char tip)

char

vised

(const cnode p[4]

)int

main

(void

)sort

(head.p, head.p +

4, cmp)

;sort

(front.p, front.p +

4, cmp)

;push

(head.p,

'1')

;push

(front.p,

'2')

; head.step =0;

front.step =0;

queueq, t;

q.push

(head)

; t.

push

(front)

;int flag =0;

while

(!q.

empty()

||!t.

empty()

) ss.

clear()

;for

(int i =

0; i <

4; i++

)for

(int i =

0; i <

4; i++

) node next = head;

next.step++

; next.p[i]

.x = row;

next.p[i]

.y = col;

sort

(next.p, next.p +

4, cmp);if

(flag ||

vised

(next.p)

=='2'

)elseif(

vised

(next.p)

=='1'

)continue

;push

(next.p,

'1')

; q.

push

(next);}

}}if(

!t.empty()

) ss.

clear()

;for

(int i =

0; i <

4; i++

)for

(int i =

0; i <

4; i++

) node next = front;

next.step++

; next.p[i]

.x = row;

next.p[i]

.y = col;

sort

(next.p, next.p +

4, cmp);if

(flag ||

vised

(next.p)

=='1'

)elseif(

vised

(next.p)

=='2'

)continue

;push

(next.p,

'2')

; t.

push

(next);}

}}}if

(flag)

printf

("yes\n");

else

printf

("no\n");

}return0;

}

HDU 1401 Solitaire (雙向廣搜)

題意 在二維8 8的方格,給定4個初始點和4個最終點,問在8步內是否能從初始點走到最終點,雙向廣搜 同時對初始點和最終點廣搜4步,對每一步記錄狀態,初始點為 1 最終點為 2 若在限定時間內初始點的狀態能到達 2 或最終點的狀態能到達 1 則為yes!要記得排序。include include in...

HDU 4587 邊雙聯通

題意 給你n個點,m條邊,要你刪除兩個點以及和這兩個點直接相連的邊,問你剩下的圖中,最大的連通分量的數目。分析 我們可以列舉每個點,然後看剩下的圖中是否有割點,這裡需要注意,乙個單獨的連通分量刪除就沒有了,坑點在這裡!include include include include include u...

hdu6375 雙端佇列

problem description 度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。初始時有 n 個空的雙端佇列 編號為 1 到 n 你要支援度度熊的 q 次操作。1 u w val 在編號為 u 的佇列裡加入乙個權值為 val 的元素。w 0 表示加在最前面,w 1 表示加在最後面 ...