第一次做雙向廣搜,這花的時間真是夠久的。
看別人部落格,在知道要把棋子排序之後思路就很清晰了,但是**實現不了…
原因是我把一對中間變數放到迴圈外面了還看不出來!
而且在**只相差變數名字的時候,複製完了總忘記改名字!
細心啊,細心啊!不耐心一點好好地寫**才會浪費更多的時間!!!
這個悲慘的故事教會我,能直接給目標變數做修改就別通過中間變數來實現。
此題還讓我還學會了減小空間可以用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 表示加在最後面 ...