POJ 1321

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=65959#problem/A

用dfs做的;

这道题和在棋盘上放皇后的题还是不一样的;

区别在于,放皇后的那题只要求不同行,不同列,不在一条斜线上,可以不断的向下递归,如果有一行无法满足条件,停止递归即可;

但是这个题不同,这个题还有限制;

需要遍历到每一个有可能的地方;

AC代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char s[15][15];
int vis[15],ans,n,m;
void dfs(int x,int sum)
{
    if(sum==m)
    {
        ans++;
    }
    for(int i=x; i<n; i++)//保证了它能遍历到每一个节点;
    {
        for(int j=0; j<n; j++)
        {
            if(s[i][j]=='#'&&vis[j]==0)
            {
                vis[j]=1;
                dfs(i+1,sum+1);//按行遍历,标记列数;
                vis[j]=0;//回溯
            }
        }
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n==-1&&m==-1)
        {
            break;
        }
        ans=0;
        memset(vis,0,sizeof(vis));
        for(int i=0; i<n; i++)
        {
            scanf("%s",s[i]);
        }
        dfs(0,0);
        printf("%d
",ans);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/qioalu/p/4916494.html