讲一下大概思路,因为题目上要求棋子不能在同一行或同一列种出现,所以我们可以按行、列来进行搜索,一行一行的搜索,然后标记搜索到的那一列,然后再往下继续搜索。结合代码看吧。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 10;
char MAP[MAXN][MAXN];
bool vis[MAXN];
int n,m,flag,sum;
int dfs(int x,int Max){
if(Max >= m){
sum++; // 当棋子数大于等于输入的m时,方案+1
return 0;
}
for(int i=x;i<n;i++){ // 从第X行搜索
for(int j=0;j<n;j++){ // 遍历列
if(!vis[j] && MAP[i][j] == '#'){ // 如果符合条件,标记该列
vis[j] = 1;
dfs(i+1 , Max+1); // 搜索下一行,棋子数+1
vis[j] = 0;
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m)&&n!=-1&&m!=-1){
memset(vis,0,sizeof(vis));
memset(MAP,0,sizeof(MAP));
for(int i=0;i<n;i++){
scanf("%s",MAP[i]);
}
sum = 0;
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}
/***
[来源] POJ 1321
[题目] 棋盘问题
[思路]
按行搜索,从第0行开始往下搜索,然后以列为对象,当存在'#'的时候,标记这一列,然后往下一行搜索
[输入]
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
[输出]
2
1
*/