题目链接:
http://poj.org/problem?id=1321
思路:
这个题确实一开始卡到我了,我一开始是直接从上往下搜的,找到标记继续往下搜,然后再回溯,但是这样很明显回溯会乱掉,结果不对。这个题的正解是传入行数,找到了话就再往这行下面搜索就好了,其余的操作都是dfs的基础操作。
总的来说这是一道蛮不错的dfs基础训练题。
代码:
#include<bits/stdc++.h>
using namespace std;
int x[10][10];
int y[10];
int z[10];
int n, m;
int ans = 0;
void dfs(int t,int t1)
{
if(t==m)
{
ans++;
return;
}
for (int i = t1; i <= n;i++)
{
for (int j = 1; j <= n;j++)
{
if(x[i][j]==1)
{
if(!y[j])
{
y[j] = 1;
dfs(t + 1, i + 1);
y[j] = 0;
}
}
}
}
}
void init()
{
ans = 0;
for (int i = 0; i < 10;i++)
{
y[i] = z[i] = 0;
}
}
int main()
{
cin >> n >> m;
while(n!=-1&&m!=-1)
{
init();
for (int i = 1; i <= n;i++)
{
for (int j = 1; j <= n;j++)
{
char z;
cin >> z;
if(z=='#')
{
x[i][j] = 1;
}
else
x[i][j] = 0;
}
}
dfs(0,1);
cout << ans << endl;
cin >> n >> m;
}
return 0;
}