棋盘问题 POJ - 1321
题目大意:
给出两个数据n m
给出一个n*n的棋盘 棋盘上 # 的位置可以放棋子
要求所放棋子不能在同一行或者同一列,要求在棋盘上放置m个棋子
求出共有多少种放置方法
分析:
DFS
遍历整个棋盘 当遇到 # 时,转入下一行,并在此之前,把这一列标记,然后在函数调用完之后,把标记撤回。
AC代码:
#include <iostream>
#include <cstring>
#define Max_Size 10
using namespace std;
char map[Max_Size][Max_Size];
bool vis[Max_Size];
int cnt,n;
int C=0;
void DFS(int x,int K){
if(K == cnt){
C++;
return ;
}
for(int i=x;i<n;i++){
for(int j=0;j<n;j++){
if(map[i][j]=='#' && !vis[j]){
vis[j]=true;
DFS(i+1,K+1);
vis[j]=false;
}
}
}
}
int main(){
int K;
while(cin>>n>>cnt){
if(n == -1 && cnt == -1)
break;
K=0;C=0; //初始化
memset(vis,false,sizeof(vis));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>map[i][j];
DFS(0,0);
cout<<C<<endl;
}
return 0;
}