題意:
就是在給定的n*n的棋盤上放k個棋子,要求不能同行同列。並且棋盤上只有#的位置才能放棋子,問總共有多少種情況?
分析:
首先看到不同行不同列,那麼想到的是神馬呢?八數碼問題。那麼就回想已有的東西里哪些可以用到。那麼這個題也就可以和八數碼問題一樣,按行來操作,那麼只標記列來標明是否衝突,那麼問題就很明瞭了。抽象爲一維的數據了。
但是,如果k==n的話,那這就和八數碼沒什麼區別了。可是這裏k
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define LL long long
#define maxn 10
using namespace std;
char mp[maxn][maxn];
int vis[maxn];
int n,k,res;
void dfs(int x,int d)
{
// cout<<x<<" " <<d<<endl;
if(x>n)return ;
if(d==k)
{
res++;
return ;
}
for(int i=0;i<n;i++)
{
if(!vis[i] && mp[x][i]=='#')
{
vis[i]=1;
dfs(x+1,d+1);
vis[i]=0;
}
}
dfs(x+1,d);
}
int main()
{
// read;
int i,j;
while(~scanf("%d%d",&n,&k))
{
if(n==-1 && k==-1 )break;
for(i=0;i<n;i++)cin>>mp[i];
int flag=0;
res=0;
dfs(0,0);
cout<<res<<endl;
}
}