棋盘问题
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. tyvj 2054 [Nescafé29]四叶草魔杖【克鲁斯卡尔+状压dp】

    传送:http://www.joyoi.cn/problem/tyvj-2054 来自lyd课件: 所以先预处理出各个sum为0的块,然后状压dfs取min来得到答案 #include<iost ...

  2. redis简介及常见问题

    目录 简介 特点 优点 高性能 高并发 为什么要用 redis 而不用 map/guava 做缓存? redis 和 memcached 的区别 Redis快的原因 为什么redis是单线程 为什么r ...

  3. n阶完全生成图的数量

    有些事不是看到了希望才去坚持,而是坚持了才会看到希望 问题 I: 星际之门(一) 时间限制: Sec 内存限制: MB 提交: 解决: [提交][状态][讨论版] 题目描述 公元3000年,子虚帝国统 ...

  4. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)

    题面 传送门 题解 日常敲板子.jpg //minamoto #include<bits/stdc++.h> #define R register #define inline __inl ...

  5. 【SPOJ-GCDEX】GCD Extreme(欧拉函数)

    题目: SPOJ-GCDEX (洛谷 Remote Judge) 分析: 求: \[\sum_{i=1}^{n}\sum_{j=i+1}^{n}gcd(i,j)\] 这道题给同届新生讲过,由于种种原因 ...

  6. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  7. ViewPager(1)FragmentPagerAdapter

    FragmentPagerAdapter 适合只有少量的pager,所有pager同时全部存在,不会有被销毁的,page过多很容易内存溢出. 1,代码 1.1 ViewPagerMain.java i ...

  8. SparkContext, map, flatMap, zip以及例程wordcount

    SparkContext 通常作为入口函数,可以创建并返回一个RDD. 如把Spark集群当作服务端那Spark Driver就是客户端,SparkContext则是客户端的核心: 如注释所说 Spa ...

  9. Kafka~消费的有效期

    消息的过期时间 我们在使用Kafka存储消息时,如果已经消费过了,再永久存储是一种资源的浪费,所有,kafka为我们提供了消息文件的过期策略,可以通过配置server.properies来实现# vi ...

  10. Spring Boot (27) actuator服务监控与管理

    actuaotr是spring boot项目中非常强大的一个功能,有助于对应用程序进行监控和管理,通过restful api请求来监管.审计.收集应用的运行情况,针对微服务而言它是必不可少的一个环节. ...