POJ -棋盘问题
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 60815 | Accepted: 29135 |
Description
Input
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
思路:典型回溯水题,不过这一次学到了不存小地图方法,就是每次存棋盘的位置就行了。而且这个样子的话,相当于给每个位置标好了号码,这样就可以吧问题转变成组合问题,我们拿个栗子说明
输入样例: #..
.#.
..#
- - 输出样例:
很明显的1,2,3,然后从中选两个,方式就是1先找后面能满足条件的,有1和2、1和3;然后从2往后找,有2和3;然后从3往后找,结束。
注意:提交的时候WA了,试试换个提交方式!!!随便放一段毒代码
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#define ll long long
using namespace std; int pa[], pb[]; //棋盘摆放 #棋盘区域 .空白区域
int n, k; //表明是n*n的矩阵 摆放k个棋子
int vx[] = { }; //走过的行的位置
int vy[] = { }; //走过的列的位置
ll sum = ; //摆放的方法
int ss; //记录#的个数
int visit[] = { }; //走过的点 void dfs(int i, int j){
if (j == k){
sum++;
}
else{
for (int l = i; l<ss; ++l){
if (visit[l] == && vx[pa[l]] == && vy[pb[l]] == ){
vx[pa[l]] = ;
vy[pb[l]] = ;
visit[l] = ;
dfs(l + , j + );
vx[pa[l]] = ;
vy[pb[l]] = ;
visit[l] = ;
}
}
}
} int main()
{
ios::sync_with_stdio(false);
while (~scanf("%d%d",&n,&k)) {
getchar();
if (n == - && k == -)break;
sum = ;
ss = ;
memset(vx, , sizeof(vx));
memset(vy, , sizeof(vy));
memset(visit, , sizeof(visit)); for (int i = ; i<n; ++i){
for (int j = ; j<n; ++j){
char temp;
cin >> temp;
if (temp == '#'){
pa[ss] = i; //把棋盘区域(i,j)加进数组
pb[ss++] = j;
}
}
}
dfs(, ); //从第一个为#的点开始,一开始摆放的棋子数为0;
cout << sum << endl;
}
return ;
}
C++提交AC,G++WA
以下AC代码:
#include<iostream>
#include<string.h>
using namespace std;
int n, k, sum, len;
int pa[], pb[], vx[] = { }, vy[] = { }, vis[] = { };
void dfs(int s, int c)
{
if (c > k)return;
if (c == k)sum++;
else {
for (int i = s; i < len;i++)
if (vis[i] == && vx[pa[i]] == && vy[pb[i]] == ){
vis[i] = vx[pa[i]] = vy[pb[i]] = ;
dfs(i + , c + );
vis[i] = vx[pa[i]] = vy[pb[i]] = ;
}
}
}
int main()
{
ios::sync_with_stdio(false);
while (cin >> n >> k, n != - && k != -){
len = sum = ; for (int i = ; i < n;i++)
for (int j = ; j < n; j++){
char ch; cin >> ch;
if (ch == '#'){
pa[len] = i;
pb[len++] = j;
}
}
dfs(, );
cout << sum << endl;
}
return ;
}
POJ -棋盘问题的更多相关文章
- poj棋盘分割(记忆化)
http://poj.org/problem?id=1191 黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来.. 想偏了 正解:递归 #include <iostream> ...
- POJ 1321 棋盘问题 --- DFS
POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...
- OpenJudge/Poj 1321 棋盘问题
1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...
- OpenJudge/Poj 1191 棋盘分割
1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1321 棋盘问题(DFS板子题,简单搜索练习)
棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44012 Accepted: 21375 Descriptio ...
- POJ 1321 - 棋盘问题 - [经典DFS]
题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...
- poj - 1191 - 棋盘切割(dp)
题意:将一个8*8的棋盘(每一个单元正方形有个分值)沿直线(竖或横)割掉一块,留下一块,对留下的这块继续这样操作,总共进行n - 1次,得到n块(1 < n < 15)矩形,每一个矩形的分 ...
- POJ - 1191 棋盘分割 记忆递归 搜索dp+数学
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...
随机推荐
- POJ2653 Pick-up sticks 判断线段相交
POJ2653 判断线段相交的方法 先判断直线是否相交 再判断点是否在线段上 复杂度是常数的 题目保证最后答案小于1000 故从后往前尝试用后面的线段 "压"前面的线段 排除不可能 ...
- asp.net mvc6学习资料整理
十分钟轻松让你认识ASP.NET MVC6 http://www.cnblogs.com/n-pei/p/4272105.html ASP.NET 5系列教程 (六): 在 MVC6 中创建 Web ...
- SP1557 GSS2 - Can you answer these queries II(线段树)
传送门 线段树好题 因为题目中相同的只算一次,我们可以联想到HH的项链,于是考虑离线的做法 先把所有的询问按$r$排序,然后每一次不断将$a[r]$加入线段树 线段树上维护四个值,$sum,hix,s ...
- ATX 学习 (三)-atxserver2-android-provider
服务端代码 代码clone到本地,搭好相应环境(怎么搭的这里就不介绍了,很好搭的哈)一般库首先查看main.py文件,debug模式开始运行 一开始就是没接触过的tornado.ioloop,有点偏底 ...
- 如何在Ubuntu上安装Wine 2.6
Wine(Wine不是模拟器)是一种开源兼容层软件应用程序,可以让Linux和Unix用户通过Winelib软件库在他们的系统上运行Windows软件. sudo add-apt-repository ...
- 大数高精度加减乘除 51nod 1005 大数加法
1005 大数加法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个大整数A,B,计算A+B的结果. Input 第1行:大数A 第2行:大数B ...
- Linux环境下RPM包相互依赖的解决办法
Linux环境下安装Oracle11gR2提示缺少"Package: elfutils-libelf-devel-0.125 FAILED"包,按照提示安装该包时又提示缺少依 ...
- 构建一个.net的干货类库,以便于快速的开发 - 工具类
相信每一个开发的框架都会有一个工具类,工具类的作用有很多,通常我会将最常用的方法放在工具类里 取得用户IP 取得网站根目录的物理路径 枚举相关 非法关键字检查 绝对路径改为相对路径 获取小数位(四舍五 ...
- HTML5 页面调用微信接口
参考微信微信官方文档JS_SDK:https://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#JSSDK.E4.BD.B ...
- Slow HTTP Denial of Service Attack 漏洞解决办法
编辑 删除 问题名称: Slow HTTP Denial of Service Attack 问题URL http://10.238.*.*:58*** 风险等级: 高 问题类型: 服务器配置类 漏洞 ...