....由於某些人認為雙向過這道比較爽,於是草草coding一番,用了g++才勉強過掉.
dk大牛說了,雙向不能求出最優解,因為它不能保證起點出發10步終點出發1步的最優,和起點出發6步和終點出發6步的次優中,前者首先被發現....
正規解法是列舉第一格翻和不翻的狀態,然後後面的跟著要求翻........
但雙向廣搜的方法值得借鑑 因此儲存下我的**思路.
要點是:
1.二進位制位狀態儲存
2.長度記錄
3.判重hash
4.型別區分
5.位運算加速
#include
<
iostream
>
#include
<
queue
>
using
namespace
std;
char
key[
25];
long
hash_st[(
1<<20)
+10];long
hash_ed[(
1<<20)
+10];long
st;long
ed;long
len;
const
longst=
1; const
longed=
2;typedef
struct
node;
queue
<
node
>
q;inline
void
bfs()
node start,end;
start.state
=st;
end.state
=ed;
start.type
=st;
end.type
=ed;
start.len=0
;end.len=0
;q.push(start);
q.push(end);
bool
finish
=false
;long
cost=0
;while(!
q.empty())
}else
}long
j;long
temp;
for(j=0
;j<
len;
++j)
}else
if(j+1
==len)
}else
node tt;
if(t.type
==st)
}else}}
}if(finish)
else
}int
main()
if(st==0
)len=i;
memset(hash_st,0,
1<<
(len+2
));memset(hash_ed,0,
1<<
(len+2
));bfs();
}return0;
}
hdu 2209 狀態壓縮廣搜
思路 20張牌 有1 20中情況 用二進位制標記,這道題的關鍵地方就是怎樣無翻牌 這裡用到位運算 1 x 若x為0 則為1 否則為0 這裡正好用到翻牌 對前兩張和後兩張 都可以和3 11 進行異或運算 對中間的和7 111 進行異或運算 include include include include...
HDU 2209 翻紙牌遊戲(DFS)
description 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 也必須跟著翻動,...
HDU 2209 翻紙牌遊戲(C C )
problem description 有一種紙牌遊戲,很有意思,給你n張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 ...