棋盘问题
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 60815   Accepted: 29135

Description

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

Input

输入含有多组测试数据。 
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
当为-1 -1时表示输入结束。 
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 

Output

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

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 -棋盘问题的更多相关文章

  1. poj棋盘分割(记忆化)

    http://poj.org/problem?id=1191 黑书上P116 想了挺久 没想出来 想推出一公式来着 退不出来.. 想偏了  正解:递归 #include <iostream> ...

  2. POJ 1321 棋盘问题 --- DFS

    POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...

  3. OpenJudge/Poj 1321 棋盘问题

    1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...

  4. OpenJudge/Poj 1191 棋盘分割

    1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...

  5. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  6. POJ 1321 棋盘问题(DFS板子题,简单搜索练习)

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

  7. POJ 1321 - 棋盘问题 - [经典DFS]

    题目链接:http://poj.org/problem?id=1321 Time Limit: 1000MS Memory Limit: 10000K Description 在一个给定形状的棋盘(形 ...

  8. poj - 1191 - 棋盘切割(dp)

    题意:将一个8*8的棋盘(每一个单元正方形有个分值)沿直线(竖或横)割掉一块,留下一块,对留下的这块继续这样操作,总共进行n - 1次,得到n块(1 < n < 15)矩形,每一个矩形的分 ...

  9. POJ - 1191 棋盘分割 记忆递归 搜索dp+数学

    http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...

随机推荐

  1. Java IO --ByteArrayOutputStream (六)***

    Java提供了很丰富的io接口,已经可以满足我们大部分读取数据的需求,这个在C读取数据需要自己定义缓冲区数组大小,而且要小心翼翼的防止缓冲区溢出的情况相当不同.一般情况下我们读取的数据都是直接读取成为 ...

  2. TI BLE STACK - OSAL

    TI 的OSAL做的很不错,不过看起来也挺费劲可能自己水平太差吧,网上买的谷雨的开发板觉得确实挺不错的. 做点学习笔记,首先是记录OSAL里执行的顺序流程,主要是task ,event,message ...

  3. 栗染-Error parsing D:\sdkforas\android-sdk-windows\system-images\android-24\android-wear\x86\devices.xml

    每次打开android virtual device manager 下面都会出现这样的问题 解决办法: 打开自己安装的sdk目录,找到/tools/lib/devices.xml去替换图中路径里面的 ...

  4. hdu6198 number number number(递推公式黑科技)

    number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. 【转载】Hadoop分布式文件系统HDFS的工作原理详述

    转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文 ...

  6. linux centos7 安装nginx并启动

    Linux下安装Nginx完整教程及常见错误解决方案:https://blog.csdn.net/chenxiaochan/article/details/63688346 CentOS 7 安装Ng ...

  7. mybatis使用中类属性名和数据库表字段名问题

    起初我以为上述二者必须一致,后来发现也是可以像Hibernate那样在xml文件中进行映射的. <mapper namespace="com.tenghu.mybatis.model. ...

  8. poj1778 All Discs Considered

    思路: 拓扑排序.贪心. 实现: #include <bits/stdc++.h> using namespace std; vector<]; int n1, n2; inline ...

  9. Django--4、认证系统

    cookie与session 概念 因http协议无法保存状态,但是又需要保存状态,所以有了cookie.它不属于http协议范畴 工作原理:相当于一段标识数据.在访问服务器产生标识内容(cookie ...

  10. SugarCRM安装过程——PHP文件上传限制问题

    找到D:\xampp\php目录下,php文件中的php.ini文件,用写字板打开: 1.查找post_max_size,指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值,默认为8M, ...