A - 棋盘问题 POJ - 1321

dfs 复杂度计算: dfs共进行a步,每步需要循环n次,复杂度为 a^n次方

首先是暴力 an*n,果然炸了

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char mp[10][10];
int rank[10], col[10];
int ans, n;void dfs(int s, int k) { // 每次记录某一列是不是存在了, dfs进入下一行 if(k == 0) {ans ++;
//      cout << "***ans = " << ans << endl;return ;}for(int i = s; i < n; i++) {for(int j = 0; j < n; j++) {if(!col[j] && !rank[i] && mp[i][j] == '#'){rank[i] = 1;col[j] = 1;dfs(s+1, k-1);rank[i] = 0;col[j] = 0;}}}
}void init() {ans = 0;memset(rank, 0, sizeof(rank));memset(col, 0, sizeof(col));
}int main() {//  freopen("test.in", "r", stdin);int k;while(~scanf("%d%d", &n, &k)) {if(n == -1 && k == -1) break;for(int i = 0; i < n; i++) {scanf("%s", mp[i]);}init();dfs(0, k);printf("%d\n", ans);}return 0;
}

剪枝,每次从上次搜索过得那行之后搜索,记录进入了哪几列,每次行的遍历不用全部进行,例如
要放9枚棋子,棋盘规格为10,则从0开始,在0~1之间一定存在一个满足条件得位置,否则往后也不可能成立
条件中k <= n <= 8此时最坏情况为走8步,每步循环8次,即 88 = 224 < 1e7

AC代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char mp[10][10];
int col[10];
int ans, n;void dfs(int s, int k) { // 每次记录某一列是不是存在了, dfs进入下一行 if(k == 0) {ans ++;return ;}for(int i = s; i <= n-k; i++) { // Eg:要放9枚棋子,棋盘规格为10,则从0开始,在0~1之间一定存在一个满足条件得位置(可能不在本行),否则条件不成立for(int j = 0; j < n; j++) {if(!col[j] && mp[i][j] == '#') {col[j] = 1;dfs(i+1, k-1);col[j] = 0;}}  }
}void init() {ans = 0;memset(col, 0, sizeof(col));
}int main() {//  freopen("test.in", "r", stdin);int k;while(~scanf("%d%d", &n, &k)) {if(n == -1 && k == -1) break;for(int i = 0; i < n; i++) {scanf("%s", mp[i]);}init();dfs(0, k);printf("%d\n", ans);}return 0;
}

A - 棋盘问题 POJ - 1321(dfs)相关推荐

  1. 棋盘问题 POJ - 1321

    题目 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方 ...

  2. poj 1321 棋盘问题(dfs)

    题目:http://poj.org/problem?id=1321 没什么难度,比较水... View Code 1 #include <iostream> 2 #include<c ...

  3. POJ 1321 棋盘问题【DFS】

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35493   Accepted: 17485 Descriptio ...

  4. 棋盘问题 ( POJ -1321 )(简单DFS)

    转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82684942   作者:Mercury_Lc 题目链接 题解:dfs入门,就是每个 ...

  5. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  6. POJ 1321 棋盘问题(回溯)

    文章目录 1. 题目 1.1 题目链接 1.2 题目大意 1.3 解题思路 2. 代码 2.1 Accepted 代码 1. 题目 1.1 题目链接 http://poj.org/problem?id ...

  7. POJ 1321 棋盘问题 搜索

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  8. POJ 1321 棋盘问题 题解

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70224 Accepted: 33254 Description 在一 ...

  9. POJ - 1321 棋盘问题

    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...

最新文章

  1. 自定义UISearchBar外观
  2. 用python画出小人发射爱心_小人发射爱心biu简笔画表情-biu小人简笔画表情动态完整版-东坡下载...
  3. comboBox设置为只读(只选)
  4. 数字、字符串、列表类型及常用内置方法
  5. python 错误、调试和测试
  6. 作研究需要的绣花功夫
  7. Django的主要开发流程(以扩充用户模型为例)
  8. 那些文献阅读能力爆表的科研学子,都在偷偷做这件事……
  9. ipython和jupyter_IPython与Jupyter Notebook以及Anaconda
  10. ReactNative 踩坑之 iOS 原生组件
  11. Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
  12. PHP扩展插件 imagick 、PDO_MYSQL 安装
  13. IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
  14. SQL调优技巧:统计信息(文末福利)
  15. java项目中的pom依赖在哪_java – 如何包含pom项目中的所有模块
  16. 【肿瘤分割】基于matlab聚类乳腺肿瘤图像分割【含Matlab源码 1471期】
  17. 汉王手写输入法android,汉王手写输入法
  18. 小学英语动词原形固定搭配+番外篇
  19. 书籍折页是什么效果_书籍折页什么样 - 卡饭网
  20. php中文网怎么修改头像,thinkphp 头像上传在线剪切编辑问题 (使用美图秀秀头像编辑器组件)...

热门文章

  1. klock 分布式锁重大更新
  2. ElasticSearch性能优化策略【转】
  3. iOS 10道细节面试题
  4. JavaScript学习总结(十六)——Javascript闭包(Closure)
  5. 前端/投资者能从阿里巴巴CACSC全球总决赛的项目路演中获得什么
  6. MySQL数据库MyISAM存储引擎转为Innodb
  7. Hadoop Backup Node
  8. 黄聪:Ubuntu下使用低版g++编译器编译TSE
  9. inittab 文件分析
  10. 网络工程师应掌握的50个路由器知识要点