[DFS]poj1321

题意:
就是在给定的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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章