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