题型:搜索
题意:中文题,就不必多说了。。。
分析:
可以用一个int型的二维数组来表示这一个8*8的棋盘,不能放的用0表示,能放的用1表示,已经放上去的用2表示。
写一个返回bool值的函数,用于判断当前选择的棋格是否在同列上已有其他棋子占用了。
然后就用DFS搜索就可以了。
注意点:
因为是一排上只会放一个棋子,所以只需要判断列上就可以了;
在写DFS函数的时候,切记要有状态还原!
由于有“%d”和“%c”之间的老容易不注意的不和谐关系,这里还是用cin比较方便一点。。。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[10][10];
int ans,n,k;
bool isfun(int x,int y){//判断是否同列(一行只放一个,就不用判断);
for(int i=1;i<x;i++){
if(map[i][y]==2){
return false;
}
}
return true;
}
void dfs(int n,int k,int num,int start){
if(num==k){
ans++;
}
for(int i=start;i<=n;i++){
for(int j=0;j<=n;j++){
if(map[i][j]&&isfun(i,j)){
map[i][j]=2;
dfs(n,k,num+1,i+1);
map[i][j]=1;//注意状态恢复(一定要有!!!)
}
}
}
}
int main(){
char tmp;
while(1){
cin>>n>>k;
if(n==-1&&k==-1) break;
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>tmp;
if(tmp=='#'){
map[i][j]=1;
}
}
}
ans=0;
dfs(n,k,0,0);
printf("%d\n",ans);
}
return 0;
}