SCOI 2005 互不侵犯
SCOI 2005 互不侵犯
题目描述:
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
输入格式:
只有一行,包含两个数N,K。
输出格式:
方案数。
样例输入:
3 2
样例输出:
16
提示:
【数据规模】
时间限制:1000ms
空间限制:256MByte
一道状压的水体。。。
#include<iostream> using namespace std; int f[11][1025][101] , n, m , maxn , ans; inline int find(int now , int down , int num) { if(((down << 1) & down) || ((down >> 1) & down)) return -1; int asdf = 0; for(int i=0;i<n;i++) { int ce = 1 << i; if(down & ce) { asdf++; if((now & ce) || ((now << 1) & ce) || ((now >> 1) & ce)) return -1; } } if(asdf + num > n) return -1; return asdf + num; } int main(){ cin >> n >> m; maxn = 1 << n; f[0][0][0] = 1; for(int i=0;i<n;i++) for(int k=0;k<n;k++) for(int j=0;j<maxn;j++) { if(f[i][j][k]) { for(int w=0;w<maxn;w++) { int ce = find(j , w , k); if(ce != -1) f[i + 1][w][ce] += f[i][j][k]; } } } for(int i=0;i<maxn;i++) ans += f[n][i][m]; cout << ans; }