博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单的dfs题 --- POJ1321 棋盘问题
阅读量:4480 次
发布时间:2019-06-08

本文共 1067 字,大约阅读时间需要 3 分钟。

题目链接:

题目大意:

你有k个棋子,若干个可以填的位置,要求填下一个棋子后其行和列不能填棋子。

思路:

dfs策略

画图理解更好些:

填下一个棋子。行列需要跳一下,dfs的时候for循环代表行,用一个vis数组来表示该列能否用,如果符合条件的需要i+1跳到下一行。

所以for循环第一个可以这样写:

for(int i = x; i < n; ++i)

下面由于用了vis数组,所以从0开始遍历就好。

 

下面是AC代码:

#include 
#include
#include
using namespace std;const int MX = 100+5;char mp[MX][MX];int vis[MX];int n, k, ans;void dfs(int x, int y){ if(y >= k) { ans++; return; } for(int i = x; i < n; ++i) for(int j = 0; j < n; ++j) { if(mp[i][j] == '#' && !vis[j]) { vis[j] = 1; dfs(i+1, y+1); vis[j] = 0; //回溯, 类似n皇后问题。 } } return;}int main(){ while(scanf("%d%d", &n, &k) != EOF && ((n!=-1)&&(k!=-1))) { ans = 0; memset(mp, 0, sizeof(mp)); memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; ++i) scanf("%s", mp[i]); dfs(0, 0); printf("%d\n", ans); }}
View Code

如有疑问,欢迎评论指出!

转载于:https://www.cnblogs.com/mpeter/p/10371271.html

你可能感兴趣的文章
es6的箭头函数
查看>>
如何消除一个数组里面重复的元素?
查看>>
or2?Scum!(周期性求解)
查看>>
触摸事件 Touch MotionEvent ACTION
查看>>
TCPdump抓包命令详解
查看>>
第一篇:初识ASP.NET控件开发_第三节:“生死有序”的控件生命周期
查看>>
repeater找主键
查看>>
Xcode 下载地址 与Macos版本要求
查看>>
C++复制构造函数和赋值符的区别
查看>>
利用memcpy函数实现float到QByteArray的相互转化
查看>>
006:Python之常用操作符
查看>>
git clone出现Permission denied (publickey)解决办法
查看>>
SPOJ 962 Intergalactic Map (从A到B再到C的路线)
查看>>
《算法设计与分析》:构造螺旋阵
查看>>
centos7 smplayer 安装 安装视频播放器
查看>>
mysql中命令框cmd的操作
查看>>
DecimalFormat用法(转)
查看>>
【Windows】线程漫谈——.NET线程同步之Interlocked和ReadWrite锁
查看>>
使用QT 4.8.6 + Cmake 3.0.0 编译 最新版本OpenCv3.0.0
查看>>
JS笔记
查看>>