版权声明:转载请注明出处。 https://blog.csdn.net/u014427196/article/details/42214607

http://poj.org/problem?id=1321

#include<stdio.h>
#include<iostream>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include <sstream>
#include <time.h>
#include <utility> 
#include <malloc.h> 

using namespace std;

int n, k, c;
char cc;
bool p[10][10];
bool visx[10];
bool visy[10];

void dfs(int pos,int a)
{
    if (a == k)
    {
        c++;
        return;
    }
    while (pos < n*n)
    {
        int x = pos / n;
        int y = pos % n;
        if (p[x][y] && !visx[x] && !visy[y])
        {
            visx[x] = visy[y] = true;
            dfs(pos+1,a+1);
            visx[x] = visy[y] = false;
        }
        pos++;
    }
    return;
}

int main()
{
    while (scanf("%d%d",&n,&k)!=EOF)
    {
        c = 0;
        if (n == -1 && k == -1)
            return 0;
        getchar();
        memset(p,false,sizeof(p));
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cc = getchar();
                if (cc == '#')
                    p[i][j] = true;
                else
                    p[i][j] = false;
            }
            getchar();
        }

        memset(visx,false,sizeof(visx));
        memset(visy, false, sizeof(visy));

        dfs(0, 0);

        printf("%d\n",c);
    }
}