洛谷P1896 [SCOI2005]互不侵犯King
阿新 • • 發佈:2017-10-24
所有 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