题目来源:点击打开链接
题目大意:给一个一定形状的棋盘,其大小为N*N,‘#’代表可放棋子,‘.’代表不可放棋子。共k个棋子,问一共有多少摆放方法?
这是一道简单的深搜问题,直接上代码了。
/**********************************
**********深度优先搜索************
***********************************/
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
using namespace std;
const int maxn = 8+2;//定义最大棋盘
int n;//记录棋盘真正大小
int k;//记录棋子个数
char mymap[maxn][maxn];//定义我的棋盘,记录形状
int col[maxn];//记录某一列有没有被放入棋子
int ans;//记录结果
//mybegin代表当前所处的行 mylength代表还有多少个棋子未被放入
void dfs( int mybegin, int mylength)
{
for( int i = 0; i < n; i++)
{
//当前列没有被放入棋子并且可以被放入棋子
if( col[i] == 0 && mymap[mybegin][i] == '#')
{
//如果只剩下一个棋子未被放入 则将它放入到mymap[mybegin][i]这个点 ans++
if( mylength == 1)
ans++;
else
{
col[i] = 1;//将当当前棋子放入到该点(mymap[mybegin][i])
//继续往下搜索
for( int j = mybegin+1; j <= n-mylength+1; j++)//n-mybegin+1 = n-(mylength-1);
dfs(j,mylength-1);//减少了一个棋子
col[i] = 0;
}
}
}
}
int main()
{
while( scanf("%d%d",&n,&k) == 2 && n != -1 && k != -1)
{
memset(col,0,sizeof(col));//初始化列标记为0,表示每一列都没有放入棋子
ans = 0;//初始化棋子
for( int i = 0; i < n; i++)
scanf("%s",mymap[i]);
for( int i = 0; i <= n-k; i++)//从第0行搜索到第n-k行,自己可以画图理解为什么这样
dfs(i,k);
printf("%d\n",ans);
}
return 0;
}