用DFS写当然很简单了,8!的复杂度,16MS搞定。

在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀。

状态转移分两种,当前行不加棋子,和加棋子。dp[i][j]中,i代表行数,j代表当前行棋子的状态。j的二进制中,1代表有旗子,0代表无棋子。

贴代码~状压DP果然快一点。

#include <cstdio>
#include <cstring>int n,k,count;
bool mp[10][10];
int num[256];
int dp[9][256];int main()
{
//    freopen("in.txt","r",stdin);for(int i=1;i<256;i++){int tmp=i;while(tmp){if(tmp&1)num[i]++;tmp>>=1;}}while(~scanf("%d%d",&n,&k) && n!=-1 && k!=-1){char str[20];for(int i=1;i<=n;i++){scanf("%s",str+1);for(int l=1;l<=n;l++){if(str[l]=='#')mp[i][l]=true;elsemp[i][l]=false;}}int status=1<<n;memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<status;j++) if(num[j]<=k){dp[i][j]+=dp[i-1][j];for(int l=1;l<=n;l++) if(mp[i][l] && (j&(1<<(l-1)))==0){dp[i][(j|(1<<(l-1)))]+=dp[i-1][j];}}}int ans=0;for(int i=0;i<status;i++) if(num[i]==k)ans+=dp[n][i];printf("%d\n",ans);}
}

还有传统的DFS……

#include <cstdio>
#include <cstring>int n,k,count;
bool mp[10][10];
bool col[10];void DFS(int x,int rest)
{if(rest==0){count++;return;}if(x>n)return;for(int i=1;i<=n;i++) if(!col[i] && mp[x][i]){col[i]=true;DFS(x+1,rest-1);col[i]=false;}if(rest+x<=n)DFS(x+1,rest);
}int main()
{
//  freopen("in.txt","r",stdin);while(~scanf("%d%d",&n,&k) && n!=-1 && k!=-1){memset(col,0,sizeof(col));char str[20];for(int i=1;i<=n;i++){scanf("%s",str+1);for(int k=1;k<=n;k++){if(str[k]=='#')mp[i][k]=true;elsemp[i][k]=false;}}count=0;DFS(1,k);printf("%d\n",count);}
}

转载于:https://www.cnblogs.com/IT-BOY/p/3231266.html

POJ 1321 棋盘问题(DFS 状压DP)相关推荐

  1. 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)

    P1914子矩阵 Accepted 标签:NOIP普及组2014[显示标签] 描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵 ...

  2. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  3. POJ - 2411 Mondriaan's Dream(状压dp)

    题目链接:点击查看 题目大意:铺瓷砖 题目分析:经典之经典的状态压缩动态规划,具体的懒得说了,怠惰ing..一个月之前写的代码,还好当时注释做的好,现在稍微一看就能立马理解,码到博客上存着吧,三种方法 ...

  4. POJ 1185 炮兵阵地(状压DP)题解

    思路:和上一篇思路一样,但是这里要求最大能排几个,这里要开三维,记录上次和上上次的状态,再一一判定,状态转移方程为 dp[i][j][k] = max(dp[i][j][k],dp[i - 1][k] ...

  5. POJ 1185 炮兵阵地(状压dp)

    http://poj.org/problem?id=1185 题意: 思路: 每一行最多只有10列,所以可以用二进制来表示每一行的状态. d[i][j][k]表示第i行状态为k时,并且上一行状态为j时 ...

  6. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  7. 【状压DP】【cofun1375】麦田

    [cofun1375]麦田 Description 话说公元199年,曹操准备与袁绍进行官渡决战.为整肃军纪,曹操下令:"全军将士,上至统帅,下至马佚,行军训练,不准践踏庄稼,不准倒犯民利, ...

  8. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  9. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

最新文章

  1. java http head 请求_http请求头header、请求体body、请求行介绍
  2. 深入理解 Java 虚拟机(第一弹) - Java 内存区域透彻分析
  3. NeurIPS 2019 | 17篇论文,详解图的机器学习趋势
  4. 记一次Hbase数据迁移和遇到的问题
  5. solr cloud 更新 solrconfig 配置_Solr各版本新特性「4.x,5.x,6.x,7.x」
  6. concat效率 mysql_MySQL统计函数GROUP_CONCAT使用陷阱分析
  7. 顶岗实习周记java方向_前途虽远,扶摇可接 | 商务日语专业顶岗实习动员大会...
  8. 常用零部件表面粗糙度标注及表面处理技术
  9. 三阶魔方还原简单七步公式
  10. 本地Remix与私链节点相连
  11. 基于 Verilog 的经典数字电路设计(14)移位寄存器
  12. 计算机的端口以及tcp/ip中的端口
  13. radmi4a Android,红米4A(Redmi 4A 全网通)一键ROOT教程,看教程ROOT
  14. 斐讯k3搭建nginx+php+MariaDB(mysql )的教程
  15. 生活随记-安心照顾母亲
  16. python 微信机器人 关键词_python-微信机器人之词云
  17. [转]Windows Mobile 常用键值(VK)对应表及系统文件夹简单介绍
  18. Tensorflow,pytorch,Caffe,MXNet,PaddlePaddle,THeano算法框架哪家强?
  19. iphone已停用解锁大概多少钱_iPhone已停用怎么办 iPhone已停用解决方案汇总
  20. 哑铃锻炼身体各个部位的方法

热门文章

  1. python中修改工作目录
  2. 2018-2019-1 20165337 《信息安全系统设计基础》第一周学习总结
  3. Android之Toast---消息提示
  4. Spring Boot实战pdf
  5. Linux真随机数的生成
  6. Ubuntu 16.04 LTS今日发布
  7. 从零开始编写自己的C#框架(9)——数据库设计与创建
  8. linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
  9. Visual C++ 菜单
  10. 腾讯十周年,看看你的QQ是什么时候注册的?