1. 程式人生 > >洛谷P1896 [SCOI2005]互不侵犯King

洛谷P1896 [SCOI2005]互不侵犯King

所有 badge 處理 esp nbsp sample radius 個數 reg

P1896 [SCOI2005]互不侵犯King

題目描述

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

輸入輸出格式

輸入格式:

只有一行,包含兩個數N,K ( 1 <=N <=9, 0 <= K <= N * N)

輸出格式:

所得的方案數

輸入輸出樣例

輸入樣例#1: 復制
3 2
輸出樣例#1: 復制
16
#include<iostream>
#include
<cstdio> using namespace std; int n,k,top=0; int c[1<<10],s[1<<10]; long long f[11][1<<10][31]; void dfs(int cond,int sum,int pos){ if(pos>n){ c[++top]=cond; s[top]=sum; return; } dfs(cond+(1<<pos-1),sum+1,pos+2); dfs(cond,sum,pos
+1); } int main(){ scanf("%d%d",&n,&k); dfs(0,0,1);//處理出一行的所有狀態 for(int i=1;i<=top;i++)f[1][c[i]][s[i]]=1; for(int i=2;i<=n;i++) for(int j=1;j<=top;j++)//一共有top種狀態 for(int h=1;h<=top;h++){ if(c[j]&c[h])continue;
if((c[j]<<1)&c[h])continue; if((c[j]>>1)&c[h])continue; for(int sum=k;sum>=s[j];sum--) f[i][c[j]][sum]+=f[i-1][c[h]][sum-s[j]]; } long long ans=0; for(int i=1;i<=top;i++)ans+=f[n][c[i]][k]; cout<<ans; return 0; }

洛谷P1896 [SCOI2005]互不侵犯King