有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻。求合法的方案总数。
<pre name="code" class="plain">var d:array[1..10] of longint; a,b:array[1..100] of longint; f:array[0..80,0..1000,0..10] of longint; ans,n,m,p,i,j,k,l,a1:longint; procedure dfs(x:longint); var i:longint; begin if x>m then begin inc(a1); for i:=1 to m do begin a[a1]:=a[a1]+(1 shl (i-1))*d[i]; inc(b[a1],d[i]); end; exit; end; dfs(x+1); d[x]:=1; dfs(x+2); d[x]:=0; end; begin readln(n,m,p); if n<m then begin n:=n xor m; m:=n xor m; n:=n xor m; end; dfs(1); f[0,0,0]:=1; for i:=1 to n do for j:=0 to p do for k:=1 to a1 do if j>=b[k] then for l:=1 to a1 do if a[k] and a[l]=0 then f[i,a[k],j]:=f[i,a[k],j]+f[i-1,a[l],j-b[k]]; for i:=1 to a1 do ans:=ans+f[n,a[i],p]; writeln(ans); end.