博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P1896 [SCOI2005]互不侵犯King
阅读量:5340 次
发布时间:2019-06-15

本文共 1300 字,大约阅读时间需要 4 分钟。

题目描述

在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。

输入输出格式

输入格式:

 

只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)

 

输出格式:

 

所得的方案数

 

输入输出样例

输入样例#1:
3 2
输出样例#1:
16

 

 

 

#include
#include
#include
using namespace std;int n,k,i,j,w,m;//n*n的棋盘k个国王int t[1010];int f[20][522][110];//f[i][j][k]表示i行j状态放置k个国王的方案数int check(int x,int y)//x在上,y在下 ,1为满足条件,0为不满足条件{ if ((x&y)!=0) return 0;//如果x和y中有上下都是1情况,返回0; if ((x&(x<<1))>0) return 0;//如果x转成二进制后有相邻的1返回0; if ((y&(y<<1))>0) return 0; //如果y转成二进制后有相邻的1返回0; if ((y&(x<<1))>0) return 0;//如果x与y的左下方有冲突,返回0; if ((x&(y<<1))>0) return 0;//如果x与y的右下方有冲突,返回0; return 1;//否则就返回1}int main(){ cin>>n>>k; m=(1<
>1]+(i&1);//将i转成2进制后1的个数,为何要用位运算:省时间! f[0][0][0]=1;//初始值 for (i=1;i<=n;i++)//枚举行 for (j=0;j<=m;j++)//枚举本行状态 for (w=0;w<=m;w++)//枚举上一行状态 if (check(w,j)==1)//如果这种放置方法合法 { for (int kkk=t[j]+t[w];kkk<=k;kkk++)//t[j]+t[w]为这两行的国王数,k为一共放置的国王数 f[i][j][kkk]=f[i][j][kkk]+f[i-1][w][kkk-t[j]/*减去本行国王数之后剩下的*/];//加进去 } int sum=0; for (i=0;i<=m;i++) sum+=f[n][i][k];//统计 printf("%d",sum);//输出 return 0;}

 

转载于:https://www.cnblogs.com/xiaoningmeng/p/5877168.html

你可能感兴趣的文章
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>