Description
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。 
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
当为-1 -1时表示输入结束。 
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 
Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output
2
1
代码如下:
 #include<stdio.h>
#include<stdio.h>
 #define max 9
#define max 9
 char M[max][max];
char M[max][max];
 int T[max], k, t, n, m;
int T[max], k, t, n, m;
 struct P
struct P


 {
{
 int i, j;
    int i, j;
 }p[max];
}p[max];
 void pr();
void pr();
 void Dfs(int i)
void Dfs(int i)


 {
{
 int l, h, x, y, z;
    int l, h, x, y, z;
 if (k == m)
    if (k == m)

 
     {
{
 t++;
        t++;
 pr();
        pr();            
 return;
        return;
 }
    }
 if (i >= n)return;
    if (i >= n)return;
 for (l = 0; l < n; l++)
    for (l = 0; l < n; l++)

 
     {
{
 if (T[l] && M[i][l] == '#')
        if (T[l] && M[i][l] == '#')

 
         {
{
 p[k].i = i;
            p[k].i = i;
 p[k].j = l;
            p[k].j = l;
 T[l] = 0;
            T[l] = 0;
 k++;
            k++;            
 Dfs(i + 1);
            Dfs(i + 1); 
 k--;
            k--;
 T[l] = 1;
            T[l] = 1;
 }
        }
 }
    }
 printf("k = %d^^^^^^\n", k);
    printf("k = %d^^^^^^\n", k);
 Dfs(i + 1);
    Dfs(i + 1);    
 }
}            
 int main()
int main()


 {
{
 int i,j;
    int i,j;
 while (1)
    while (1)

 
     {
{
 scanf("%d%d", &n,  &m);
        scanf("%d%d", &n,  &m);
 getchar();
        getchar();
 if (n == -1 && m == -1)
        if (n == -1 && m == -1)

 
         {
{
 break;
            break;
 }
        }
 for (i = 0; i < n ;i++)
        for (i = 0; i < n ;i++)

 
         {
{
 T[i] = 1;
            T[i] = 1;
 scanf("%s", M[i]);
            scanf("%s", M[i]);
 }
        }
 t = 0;
        t = 0;
 k = 0;
        k = 0;
 Dfs(0);
        Dfs(0);
 printf("%d\n", t);
        printf("%d\n", t);                
 }
    }
 system("pause");
    system("pause");
 return 0;
    return 0;
 }
}
 void pr()
void pr()


 {
{
 int z, x, y;
    int z, x, y;
 z = 0;
    z = 0;
 printf("%d--------\n", t);
    printf("%d--------\n", t);
 for (x = 0; x < n; x++)
    for (x = 0; x < n; x++)

 
     {
{
 for (y = 0; y < n; y++)
        for (y = 0; y < n; y++)

 
         {
{
 if (x == p[z].i && y == p[z].j)
            if (x == p[z].i && y == p[z].j)

 
             {
{
 z++;
                z++;
 printf("%c", M[x][y]);
                printf("%c", M[x][y]);
 }
            }
 else printf(".");
            else printf(".");
 }
        }
 printf("\n");
        printf("\n");
 }
    }
 printf("------\n");
    printf("------\n");    
 }
}