题目:http://poj.org/problem?id=1321
Description:
在n*n的棋盘上摆棋子,棋子没有区别,要求任意两个棋子不能放在同一行或同一列,求摆放k个棋子时的方案数c为多少。
Solution:
#include<iostream>
#include<stdio.h>
using namespace std;
char Map[9][9];
int Book[9];
int n;//棋盘大小 n*n
int k;//棋子数
int num;//已放棋子数
int C;//方案数
//从第一行第一列到第一行第二列......到第一行第n列遍历
//再从第二行第一列到第二行第二列......到第二行第n列遍历
//再从第三行...
void dfs(int line)
{
if(num == k)
{
C++;
return;
}
if(line >= n)
{
return;//如果走到了最后一行,那么返回上一行
}
for(int column = 0; column < n; column++)
{
if(Book[column] == 0 && Map[line][column] == '#')
{
Book[column] = 1;
num++;
dfs(line+1);
Book[column] = 0;
num--;
}
}
//走到这里说明走到了最后一列,但是没有走到最后一行
dfs(line+1);//从下一行开始继续寻找可行方案
}
int main()
{
while(cin >> n >> k)
{
C = 0;
if(n == -1 && k == -1)
break;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> Map[i][j];
}
}
dfs(0);
cout << C << endl;
}
return 0;
}