OpenJudge_1321:棋盘问题
题目描述
输入
输出
示例输入
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
示例输出
2
1
又是一道见到标题就知道是哪个类型的题目:- 与8皇后问题类似,但又不完全一样。少了斜向判断,但是k 不等于n 了。
如果k = n,那么:
#include<stdio.h>
#include<string.h>
int map[][];
int vis[];
int ans, k, n;
void dfs(int, int);
int main(void)
{
while(scanf("%d%d", &n, &k))
{
if(n == - && k == -)
break;
memset(map, , sizeof(map));
memset(vis, , sizeof(vis));
for(int row = ; row <= n; row++)
for(int col = ; col <= n; col++)
scanf(" %c", &map[row][col]); // %c前面的空格用于过滤空白符(换行/空格/制表) ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
} void dfs(int row, int count) // count为已经放置的棋子数
{
if(count == k)
{
ans++;
return;
} for(int col = ; col <= n; col++)
{
if(map[row][col] == '#' && !vis[col])
{
vis[col] = ; // 1表示当前列已占据
dfs(row+, count+);
vis[col] = ; // 取消标志
}
}
}
但是题目要求k ≤ n,因此有:
#include<stdio.h> // 40MS
#include<string.h>
int map[][];
int vis[]; // 拜访过的列,置0表示未访问
int ans, k, n;
void dfs(int, int);
int main(void)
{
while(scanf("%d%d", &n, &k))
{
if(n == - && k == -)
break;
memset(map, , sizeof(map));
memset(vis, , sizeof(vis));
for(int row = ; row <= n; row++)
for(int col = ; col <= n; col++)
scanf(" %c", &map[row][col]); // %c前面的空格用于过滤空白符(换行/空格/制表) ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
} void dfs(int row, int count) // row为将要放置棋子的行数,count为已经放置的棋子数
{
if(count == k)
{
ans++;
return;
}
if(row > n)
return;
for(int col = ; col <= n; col++)
{
if(map[row][col] == '#' && !vis[col])
{
vis[col] = ; // 1表示当前列已占据
dfs(row+, count+);
vis[col] = ; // 取消标志
}
} dfs(row+, count);
}
该程序和最前面那个程序主要有两处不同,row > n 用来防止数组下标越界,因为最前面那个程序行和列同时增加,而后者存在只有行增的情况。应该可以看出count == k 和row > n 从一定程度上来说就是用来防止无限递归的。此外,该程序耗时40MS,是因为我们还没有剪枝,下面我写了一个0MS的:
#include<stdio.h> // 0MS
#include<string.h>
int map[][];
int vis[];
int ans, k, n;
void dfs(int, int);
int main(void)
{
int can_put;
while(scanf("%d%d", &n, &k))
{
if(n == - && k == -)
break;
memset(map, , sizeof(map));
memset(vis, , sizeof(vis));
can_put = ;
for(int row = ; row <= n; row++)
for(int col = ; col <= n; col++)
{
scanf(" %c", &map[row][col]); // %c前面的空格用于过滤空白符(换行/空格/制表)
if(map[row][col] == '#')
can_put++;
}
if(can_put < k) // 定界剪枝
{
printf("0\n");
continue;
}
ans = ;
dfs(, );
printf("%d\n", ans);
}
return ;
} void dfs(int row, int count) // row为将要放置棋子的行数,count为已经放置的棋子数
{
if(count == k)
{
ans++;
return;
}
if(row > n || k-count > n-row+) // 定界剪枝
return;
for(int col = ; col <= n; col++)
{
if(map[row][col] == '#' && !vis[col])
{
vis[col] = ; // 1表示当前列已占据
dfs(row+, count+);
vis[col] = ; // 取消标志
}
} dfs(row+, count);
}
OpenJudge_1321:棋盘问题的更多相关文章
- TYVJ1035 棋盘覆盖
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...
- POJ 1321 棋盘问题(dfs)
传送门 棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38297 Accepted: 18761 Descri ...
- 设计一个自动生成棋盘格子的JS小程序
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- BZOJ1057[ZJOI2007]棋盘制作 [单调栈]
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- 【ZJOI2007】棋盘制作 BZOJ1057
Description 国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对 ...
- Unity手撸2048小游戏——自动生成4*4棋盘
1.新建文件夹,命prefabs,将刚刚做成的Chessman拖入该文件下,做成预制体 2.删除panel下的Chessman 3.在panel下,新建一个空对象,命名为Chessboard,大小设置 ...
- C# 围棋盘的画法
C#绘图不是那么美,不过对于简单的图形,不注重美感的图质,用C#还是很方便的. 背景颜色.绘制图表线色.纵横列大小可按照个人喜好调节. 不提供AI代码,我自己设计的AI不是很完美,就不拿出来献丑了,算 ...
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
随机推荐
- java‘小秘密’系列(三)---HashMap
java'小秘密'系列(三)---HashMap java基础系列 java'小秘密'系列(一)---String.StringBuffer.StringBuilder java'小秘密'系列(二)- ...
- HDU 6184 Counting Stars 经典三元环计数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6184 题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V ...
- 南昌招聘.net开发大牛
职位诱惑: 12年名企5险1金齐全+WEB&移动研发=丰厚回报 职位描述: 聘精通web开发成员共同成就事业! 中国领先的WEB内核 研发机构.华中地区唯一自主CMS研发厂商.江西最大的网站服 ...
- vue引入echarts、找不到的图表引入方法、图表中的点击事件
1.在vue-cli项目中添加webpack配置,本文引入的最新版本.在 3.1.1 版本之前 ECharts 在 npm 上的 package 是非官方维护的,从 3.1.1 开始由官方 EFE 维 ...
- 聊聊并发-Java中的Copy-On-Write容器
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp78 聊聊并发-Java中的Copy-On-Write容器 Cop ...
- 【笔记】shellcode相关整理
0x01:shellcode定义 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是作为数据发送给受攻击服务器 ...
- java1.8新特性
转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...
- css预处理器less和scss之less介绍(一)
第一次发的标题有误,重发一遍,抱歉了 一.less基础语法 1.声明变量:@变量名:变量值 使用变量:@变量名 例如 @color : #ff0000; @length : 100px; #div1{ ...
- 四则运算 WEB
coding.net:https://git.oschina.net/ysh0904/WEB.git 一.需求分析 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算 ...
- java中null的类型匹配
null作为一个特殊的参数匹配为String对象