简单的dfs题 --- POJ1321 棋盘问题

题目链接:

http://poj.org/problem?id=1321

题目大意:

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

思路:

dfs策略

画图理解更好些:

简单的dfs题 --- POJ1321 棋盘问题

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

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

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

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

下面是AC代码:

#include <iostream>
#include <cstdio>
#include <string.h> using namespace std;
const int MX = +; 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 = ; j < n; ++j)
{
if(mp[i][j] == '#' && !vis[j])
{
vis[j] = ;
dfs(i+, y+);
vis[j] = ; //回溯, 类似n皇后问题。
}
}
return;
} int main()
{
while(scanf("%d%d", &n, &k) != EOF && ((n!=-)&&(k!=-)))
{
ans = ;
memset(mp, , sizeof(mp));
memset(vis, , sizeof(vis));
for(int i = ; i < n; ++i) scanf("%s", mp[i]);
dfs(, );
printf("%d\n", ans);
}
}

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

上一篇:金庸笔下的"程序员" | 附金庸武侠全集


下一篇:centos 进程查看