互不侵犯(BZOJ1087) 題解

2022-08-30 12:06:06 字數 2639 閱讀 6430

在n×n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。

3 216

本題為scoi2005的題,正解應該是狀態壓縮動態規劃,把所有方案變為二進位制儲存,1為該位置擺放了國王,0為沒有,因為一行最多九個格仔,也就是說最多為511,空間上完全可以接受。然後我們可以先預處理一下所有可行的國王擺放的位置,以減少動規的次數,設f[i,j,k]為現在是第i行,用第j種方案,一共擺放了k個國王的總方案數,那麼我們動規的條件就是f[i,j,k]=∑f[i-1,s,t]

於是對於每個可行方案,我們需要記錄一些東西:這個可行方案擺了多少國王,這個可行方案的攻擊範圍。那麼滿足條件的s即為s and j=0。

1

type rec=record

2j,l,p:longint;

3end;4

var f:array[1..9,0..512,0..80] of

int64;

5n,m,i,j,w,k,q,total,l:longint;

6ans:int64;

7fl:boolean;

8 fa:array[1..500] of

rec;

9procedure

dfs(w,dep,t:longint);

10var

i:longint;

11s:string;

12ch:string;

13begin

14if dep>n then

15begin

16inc(total);

17 fa[total].j:=t;

18 i:=t;

19 s:='';20

while i<>0

do21

begin

22if i and

1=1then

23inc(fa[total].l);

24 str(i and

1,ch);

25 s:=ch+s;

26 i:=i shr 1;27

end;

28while length(s)do

29 s:='

0'+s;

30for i:=n downto1do

31if i=1

then

32begin

33if (s[i]='

1')or(s[i+1]='

1') then

34 fa[total].p:=fa[total].p+(1 shl (n-i));

35end

36else

37if i=n then

38begin

39if (s[i]='

1')or(s[i-1]='

1') then

40 fa[total].p:=fa[total].p+1;41

end42

else

43if (s[i]='

1')or(s[i-1]='

1')or(s[i+1]='

1') then

44 fa[total].p:=fa[total].p+(1 shl (n-i));

45exit;

46end;47

if w=1

then

48 dfs(0,dep+1

,t)49

else

50for i:=0to1

do51

begin

52 t:=t+i shl (dep-1

);53 dfs(i,dep+1

,t);

54end;55

end;

56begin

57readln(n,m);

58if m>sqr((n+1)shr 1) then

59begin

60 writeln(0

);61

halt;

62end

;63 dfs(0,1,0

);64

for i:=1

to total do

65 f[1,fa[i].j,fa[i].l]:=1;66

for i:=2

to n do

67for j:=1

to total do

68for l:=0

to ((n+1)shr 1)*(i-1) do

69if f[i-1,fa[j].j,l]=0

then

70continue

71else

72for k:=1

to total do

73if fa[j].p and fa[k].j=0

then

74 inc(f[i,fa[k].j,l+fa[k].l],f[i-1

,fa[j].j,l]);

75for i:=1

to total do

76 ans:=ans+f[n,fa[i].j,m];

77writeln(ans);

78end.

BZOJ 1087, 互不侵犯

傳送門 給定一張大小為n n的棋盤,要求放置k個棋子,其中,棋子上下左右以及左上 左下 右上和右下八個位置不得有其它棋子存在。求合法方案數。動態規劃。狀態數很多,可以先預處理出一行的合法放置方案,再處理出上一行放置的情況下,下一行哪些方案是可行的,於是一行一行轉移即可。運用位運算優化預處理,後來四重...

BZOJ 1087( ) 互不侵犯

1087 scoi2005 互不侵犯king time limit 10 sec memory limit 162 mb submit 5333 solved 3101 submit status discuss description 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方...

BZOJ 1087 互不侵犯King

1087 scoi2005 互不侵犯king time limit 10 sec memory limit 162 mb description 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上 左下右上右下八個方向上附近的各乙個格仔,共8個格仔。i...