2016-08-10

题源:http://acm.hust.edu.cn/vjudge/contest/65959#overview

A - 棋盘问题

思路:要放k个棋子,dfs贪心深搜。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=10;
int mmap[MAXN][MAXN];  //棋盘
bool vis[MAXN];    //标记数组 vis[1]=true表示1行已放棋子
int n,k;

int ans;
int sum;  //记录已经放了多少个旗子

void dfs(int i)
{
    if(sum==k)
    {
        ans++;
        return;
    }
    if(i>=n) return;
    for(int j=0;j<n;j++)
    {
        if(!vis[j]&&mmap[i][j])
        {
            sum++;
            vis[j]=true;
            dfs(i+1);
            sum--;
            vis[j]=false;
        }
    }
    dfs(i+1);  //第i行不放
}

int main()
{
    while(cin>>n>>k&&n!=-1&&k!=-1)
    {
        char temp;
        ans=0;
        sum=0;
        memset(mmap,0,sizeof(mmap));
        memset(vis,false,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>temp;
                if(temp=='#')
                    mmap[i][j]=1;
            }
        }
        dfs(0);
        cout<<ans<<endl;

    }

    return 0;
}
View Code

 

相关文章: