HDU 2209 資料弱,雙向直接過

2022-06-03 09:12:07 字數 1587 閱讀 7902

....由於某些人認為雙向過這道比較爽,於是草草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張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態 有些朝正,有些朝反 現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌 由正翻到反,或者有反翻到正 時,他左右兩張紙牌 最左邊和最右邊的紙牌,只會影響附近一張 ...