题意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
像八皇后那题~~~注意恢复原来的状态就可以了。
-------------------------DFS还需要练习----------------------------------------------------------------------------
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int mr[10];
int mc[10];
int n;
int k;
char ch;
int ans=0;
struct po
{
int r,c;
}p[10*10+3];
int maxn=0;
int judge(int rr,int cc)
{
if(!mr[rr]&&!mc[cc])
return true;
else
return false;
}
void change (int rr,int cc,int m)
{
mr[rr]=m;
mc[cc]=m;
}
void dfs(int s, int e)
{
if(e==k)
{
ans++;
return ;
}
for(int i=s;i<maxn;i++)
{
int nr=p[i].r;
int nc=p[i].c;
if(judge(nr,nc))
{
change(nr,nc,1);
dfs(i+1,e+1);
change(nr,nc,0);
}
}
}
int main()
{
while(cin>>n>>k,n!=-1&&k!=-1)
{
int sum=0;
int rr,cc;
maxn=0;
memset(mr,0,sizeof(mr));
memset(mc,0,sizeof(mc));
for(int i=1;i<=n;i++)
{
getchar();
for(int j=1;j<=n;j++)
{
cin>>ch;
if(ch=='#')
{
p[maxn].r=i;
p[maxn].c=j;
maxn++;
sum++;
}
}
}
if(sum<k)
cout<<'0'<<endl;
else
{
ans=0;
dfs(0,0);
cout<<ans<<endl;
}
}
return 0;
}