题目名
POJ 1321-棋盘问题(dfs)
首先确定dfs的递归需要回溯,然后就是把列的问题用一个for循环解决。行的问题用S记录,可以判断越界了就停止DFS。
这个处理很好啊。
#include<iostream>
#include<algorithm>
using namespace std;
char map[10][10];
int vis[10];
int sum;
int cnt;
int n, k;
void dfs(int s)
{
if (cnt==k)
{
sum++;每摆完一次棋子,就让方法数加一。
return;
}
else
{
if (s >= n)
{
return;//棋子太多已经没地方放了
}
else
{
for (int i = 0; i < n; i++)
{
if (map[s][i] == '#' && !vis[i])
{
cnt++;
vis[i] = 1;
dfs(s + 1);
cnt--;
vis[i] = 0;
//没实现一种摆法,就记得要回溯,这个回溯的执行,是从最后开始倒着的,所以不用担心他的影响,下一次查找也不会影响到。
}
}
}
}
dfs(s + 1);
}
int main()
{
while (cin>>n>>k)
{
if (n==-1&&k==-1)
{
break;
}
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> map[i][j];
}
}
cnt = sum = 0;
dfs(0);
cout << sum << endl;
}
}