给出一个n*n的地图,只有#号位置能放置棋子,棋子之间不能同行或同列,求在地图上放置k枚棋子的方案数。
简单暴力搜索。
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int n,k,ans;
char mp[10][10];
int r[10],c[10]; ///r用来标记行,c用来标记列
bool judge(int x,int y) ///判断某个位置是否合法
{
if(r[x]==0 && c[y]==0 && mp[x][y]=='#') return true;
else return false;
}
void dfs(int pos,int num)
{
int x = pos/n;
int y = pos%n;
if(num == k)
{
ans++;
return;
}
if(pos == n*n) return;
if(judge(x,y))
{
r[x] = 1;
c[y] = 1;
dfs(pos+1,num+1);
r[x] = 0;
c[y] = 0;
}
dfs(pos+1,num); ///执行这一步说明位置不合法或合法不放置
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
if(n == -1 && k == -1)
break;
for(int i = 0; i < n; i++)
scanf(" %s",mp[i]);
memset(r,0,sizeof(r));
memset(c,0,sizeof(c));
ans = 0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}