题目描述
在N*N的国际象棋棋盘上摆放K个棋子,棋子没有区别,摆放时任意两个棋子不能放在棋盘的同一行或同一列,’#'表示棋盘区域,无法摆放,求所有可行的摆放方案数量。
思路
用一个一维数组即可表示该行或该列有没有摆过棋子
剪枝只有一种,看是否在该行或该列有棋子摆放
中规中矩的DFS
AC代码
#include<iostream>
#include<stdio.h>
using namespace std;
char map[9][9];
int visited[9];
int n;//棋盘大小 n*n
int k;//棋子数
int num;//已放棋子数
int solve;//方案数
void dfs(int line){
if(num==k)
solve+=1;
if(line>n)
return;
for(int column = 0; column < n; column++){
if(visited[column] == 0 && map[line][column] == '#'){
visited[column] = 1;
num++;
dfs(line+1);
visited[column] = 0;
num--;
}
}
}
int main(){
while(cin >> n >> k){
solve= 0;
if(n == -1 && k == -1)
break;
for(int i = 0; i < n; i++)d
for(int j = 0; j < n; j++)
scanf("%c",&map[i][j]);
dfs(0);
printf("%d",solve);
}
return 0;
}
心得
算是很简单的DFS了,希望写博客有收获,乌拉