棋盘问题:
https://vjudge.net/contest/230934#problem/A
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放K个棋子的所有可行的摆放方案。
思路:问题的特点是不同行不同列,这道题可以用深搜来解决,可以先搜i行,然后用一维数组来记录某列是否已经放了棋子,i行判断完后再搜i+行,当放的棋子数达到K时方案数就+1。
#include<iostream>
#include<cstring>
using namespace std;
char a[10][10];
bool vis[10];//判断某列是否放了棋子
int n, k;
int c;//方案数
int num;//已经放的棋子数
void dfs(int s)
{
if (num == k)
{
c++;
return;//这里的return不能漏写了!!一种方案放完需要返回上一层搜看还有没有其他方案
}
else
{
if (s >= n)
return;
else
{
for (int i = 0; i < n; i++)
{
if (a[s][i] == '#' && !vis[i])//确保第i列没有放棋子
{
vis[i] = 1;
num++;
dfs(s + 1);
num--;
vis[i] = 0;
}
}
dfs(s + 1);//若第s行都没有可以放的列,就向s+1行搜
}
}
}
int main()
{
while (cin >> n >> k&&n != -1 && k != -1)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
memset(vis, 0, sizeof(vis));//使vis数组全赋0;
num = 0;
c = 0;
dfs(0);//从第0行开始搜
cout << c << endl;
}
return 0;
}