A

地图看起来不太大,可以试试深搜,试一下..
还是比较简单的搜索,竟然一下就过...................
#include<stdio.h>
#include<string.h>

#define maxn 20

int m;                                          //地图长和宽
int C;                                          //摆放的方案总数
int p[maxn];                                    //标记数组,这列是否已经摆放
char G[maxn][maxn];                             //保存地图


void DFS(int r, int k)                          //第r行和剩余需要摆放的数目k
{
    int i;

    if(k == 0)
    {
        C++;
        return ;
    }
    if(r >= m)return ;

    for(i=0; i<m; i++)
    {
        if(G[r][i] == '#' && p[i] == 0)
        {
            p[i] = 1;
            DFS(r+1, k-1);
            p[i] = 0;
        }
    }

    DFS(r+1, k);//这行不摆放,直接进入下行
}

int main()
{
    int k;                                      //需要摆放棋子的数目

    while(scanf("%d%d", &m, &k), m != -1)
    {
        int i;

        for(i=0; i<m; i++)
            scanf("%s", G[i]);

        memset(p, 0sizeof(p));
        C = 0;

        DFS(0, k);

        printf("%d ", C);
    }

    return 0;

} 

原文地址:https://www.cnblogs.com/liuxin13/p/4647660.html