A - 棋盘问题 POJ - 1321(dfs)
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)相关推荐
- 棋盘问题 POJ - 1321
题目 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方 ...
- poj 1321 棋盘问题(dfs)
题目:http://poj.org/problem?id=1321 没什么难度,比较水... View Code 1 #include <iostream> 2 #include<c ...
- POJ 1321 棋盘问题【DFS】
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35493 Accepted: 17485 Descriptio ...
- 棋盘问题 ( POJ -1321 )(简单DFS)
转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82684942 作者:Mercury_Lc 题目链接 题解:dfs入门,就是每个 ...
- POJ 1321 棋盘问题(DFS 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- POJ 1321 棋盘问题(回溯)
文章目录 1. 题目 1.1 题目链接 1.2 题目大意 1.3 解题思路 2. 代码 2.1 Accepted 代码 1. 题目 1.1 题目链接 http://poj.org/problem?id ...
- POJ 1321 棋盘问题 搜索
Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...
- POJ 1321 棋盘问题 题解
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 70224 Accepted: 33254 Description 在一 ...
- POJ - 1321 棋盘问题
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. ...
最新文章
- 自定义UISearchBar外观
- 用python画出小人发射爱心_小人发射爱心biu简笔画表情-biu小人简笔画表情动态完整版-东坡下载...
- comboBox设置为只读(只选)
- 数字、字符串、列表类型及常用内置方法
- python 错误、调试和测试
- 作研究需要的绣花功夫
- Django的主要开发流程(以扩充用户模型为例)
- 那些文献阅读能力爆表的科研学子,都在偷偷做这件事……
- ipython和jupyter_IPython与Jupyter Notebook以及Anaconda
- ReactNative 踩坑之 iOS 原生组件
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突)
- PHP扩展插件 imagick 、PDO_MYSQL 安装
- IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
- SQL调优技巧:统计信息(文末福利)
- java项目中的pom依赖在哪_java – 如何包含pom项目中的所有模块
- 【肿瘤分割】基于matlab聚类乳腺肿瘤图像分割【含Matlab源码 1471期】
- 汉王手写输入法android,汉王手写输入法
- 小学英语动词原形固定搭配+番外篇
- 书籍折页是什么效果_书籍折页什么样 - 卡饭网
- php中文网怎么修改头像,thinkphp 头像上传在线剪切编辑问题 (使用美图秀秀头像编辑器组件)...