POJ 1321 简单dfs

1、POJ 1321  棋盘问题   

2、总结:

题意:给定棋盘上放k个棋子,要求同行同列都不重。

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#define max(a,b) a>b?a:b
#define F(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=10010,MAX=1000100;

int n,k,sum;
int col[15];
char mapn[15][15];

void dfs(int cow,int kk)
{
    F(i,1,n){
        if(mapn[cow][i]=='#'&&!col[i]){
            if(kk==1)sum++;
            else {
                col[i]=1;
                F(begin,cow+1,n-kk+2){    //即从begin这行开始到n-kk+2行都作为本次dfs的起始行,这样才可保证不遗漏不重复
                    dfs(begin,kk-1);
                }
                col[i]=0;
            }
        }
    }
    return ;
}

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1)break;
        F(i,1,n)F(j,1,n)
            cin>>mapn[i][j];
        mes(col,0);
        sum=0;
        F(i,1,n-k+1){   //依次搜第1到n-k+1行,即第1个棋子在第1到n-k+1行里选
            dfs(i,k);   
        }
        cout<<sum<<endl;
    }

    return 0;
}
View Code

 

posted @ 2016-09-22 13:39  v9fly  阅读(143)  评论(0编辑  收藏  举报