还是比较简单的搜索,竟然一下就过...................
#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, 0, sizeof(p));
C = 0;
DFS(0, k);
printf("%d ", C);
}
return 0;
#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, 0, sizeof(p));
C = 0;
DFS(0, k);
printf("%d ", C);
}
return 0;
}