题目:

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

分析与解答

k<=n,我觉得这个和八皇后不同一点就是八皇后列从第一行一直找到最后第n行,但是这个可以在某一行不放棋子。于是我们dfs里面就要考虑写一个二重循环,行和列都要考虑到,我们假设固定行,就是说,每次行从第x行开始,就算回溯了,还可以从第x+i行继续调用,从而考虑到所有情况
由于是一行一行的调用,因此已经放置的棋子必然不再同一行,那现在就需要考虑怎么整一个条件能够去判断是不是在同一列,额当然了,用一个标记数组visit,如果如果标志数组visit[j]=0说明第j列没有用过,那我们就可以大胆的放到第j列了
dfs(x,y)的意思是在第x行准备放第y+1个棋子,额就是现在已经放了y个棋子了,我们固定了这第x行,从第一列开始找,我们放棋子的条件是!visit[j]&&mp[i][j]==’#’,找到一满足条件的列,我们就把棋子放这一列上,放完这一行的棋子,我们就继续递归找下一行,递归完了还要清除标志数组,因为除了在第x行的第j列放棋子,仍有可能在其他列仍然能放棋子。而dfs的返回条件就是现在放的棋子个数y已经等于k了,那就return了

代码参考:
https://www.cnblogs.com/ECJTUACM-873284962/p/6747947.html

#include<iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
int visit[20];
char mp[20][20];
int ans;
int k;
int n;
int DFS(int x,int y)
{if(y==k){ans++;return 0;}for(int i=x;i<n;i++){for(int j=0;j<n;j++){if(!visit[j]&&mp[i][j]=='#'){visit[j]=true;DFS(i+1,y+1);visit[j]=false;}}}return 0;
}
int main()
{while(cin>>n>>k){if(n==-1&&k==-1)break;memset(visit,false,sizeof(visit));memset(mp,false,sizeof(mp));for(int i=0;i<n;i++)cin>>mp[i];ans=0;DFS(0,0);cout<<ans<<endl;}return 0;
}

(DFS)棋盘问题(poj1321)相关推荐

  1. POJ1321 棋盘问题(DFS)

    深度搜索,但是要注意搜索的方式: 本文给出两份代码,一份是AC代码,一份是超时的,你们感受下. 从第一行开始,对于每一行,搜索整行,如果有'#',标记,然后,则搜索下一行. AC代码: /*POJ13 ...

  2. POJ1321 Bailian1321 棋盘问题【DFS】

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

  3. 【POJ1321棋盘问题】【poj2251Dungeon Master】【poj3278Catch That Cow】【poj1426Find The Multi】

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

  4. A - 棋盘问题 POJ - 1321(dfs)

    A - 棋盘问题 POJ - 1321 dfs 复杂度计算: dfs共进行a步,每步需要循环n次,复杂度为 a^n次方 首先是暴力 an*n,果然炸了 #include<cstdio> # ...

  5. POJ 1321 棋盘问题【DFS】

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

  6. POJ 2488 A Knight's Journey (棋盘DFS)

    A Knight's Journey   大意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. 1 #include <map> 2 #in ...

  7. 2015 百度之星 1003 棋盘占领 dfs

    棋盘占领 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_show ...

  8. poj1321 DFS

    棋盘问题 Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class n ...

  9. POJ1321 棋盘问题

                                                                                            棋盘问题 Time Li ...

最新文章

  1. [Webpack 2] Intro to the Production Webpack Course
  2. Machine Learning week 8 quiz: programming assignment-K-Means Clustering and PCA
  3. SAP 4.6C升级ECC6.0 WS_QUERY 的改法
  4. 使用cordova进行App打包
  5. linux查询所建文件夹,linux中的文件和文件夹的新建、查询、删除
  6. 经典计算机实现量子逻辑门,量子计算机:对量子逻辑门的探讨
  7. cascade=CascadeType.ALL的深坑
  8. 作业5.2 5.3
  9. 解决Visual Studio 2015启动慢的问题
  10. 【一分钟知识】梯度下降与牛顿法对比
  11. 无线路由器网络测试软件,如何简单快速测试家里无线路由器的网速和性能?
  12. 【图片、字符画互转】字符画实现(JAVA)
  13. Maven异常:0.0.1-SNAPSHOT: Could not find artifact
  14. 200 件实物,从过往的平面设计窥视上海的变化
  15. Mininet系列实验(六):Mininet动态改变转发规则实验
  16. Java - 什么是UML?
  17. 设定软件使用期限,根据网络时间保护试用软件产品的方法
  18. android相机横屏竖屏,GitHub - qixuefeng/CameraAdapt: Android相机屏幕适配
  19. OpenMesh-网格光顺的算法
  20. 2022-2028全球与中国绿色氢基微电网市场现状及未来发展趋势

热门文章

  1. Oracle笔记:备份还原
  2. 错误 4 error C2220: 警告被视为错误 - 没有生成“object”文件
  3. python都有哪些包装_Python基础:21包装
  4. anaconda新建python2环境安装不了jupyterlab_在Mac下安装anaconda及配置jupyterLab和PyTorch的方法...
  5. 生物学专业_江南大学微生物学(发酵)20002008历年考研专业课真题汇编
  6. 线程中如何使用对象_在 Flink 算子中使用多线程如何保证不丢数据?
  7. oracle conneciton properties,在WAS Liberty连接池中,我可以验证借用连接吗?
  8. 计算机知识竞赛决赛流程,计算机知识竞赛决赛圆满结束!还不快戳?!
  9. mysql四种隔离级别知乎_详解MySQL事务的四大特性和隔离级别
  10. Android平台RTMP推送端实现外部数据对接推送和录像