棋盘问题——北大OJ

题目链接
http://poj.org/problem?id=1321
思路
由于是北大OJ所以代码部分万能头文件不能用,整体思路就是按行枚举,找到‘#’同时判断对应行列标记数组是否已经被标记,本题唯一的坑在于,按行遍历的起始行需要在上一层的行数基础上+1枚举下一行,否则会导致后面的与前面重复配对,而且你还没来得及WA就TLE了。
c++代码

#include<iostream>
#include<stdio.h>
using namespace std;
char a[9][9];
int col[9]={
    
    0};
int n,k;
int sum=0;
void dfs(int u,int x)
{
    
    
    if(u==k)
    {
    
    
        sum++;
        return;
    }
    else
    {
    
    
        for(int i=x;i<n;i++)
        {
    
    
            for(int j=0;j<n;j++)
            {
    
    
                if(a[i][j]=='#'&&!col[j])
                {
    
    
                    col[j]=1;
                    dfs(u+1,i+1);
                    col[j]=0;
                }
            }
        }
    }
 
}
int main()
{
    
    
    while(1)
    {
    
    
        scanf("%d%d",&n,&k);
        if(n==-1&&k==-1)
        {
    
    
            break;
        }
        else
        {
    
    
            for(int i=0;i<n;i++)
            {
    
    
                for(int j=0;j<n;j++)
                {
    
    
                    cin>>a[i][j];
                }
            }
        }
        dfs(0,0);
        printf("%d\n",sum);
        sum=0;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Star_Platinum14/article/details/111876462