POJ_1321 棋盘问题(深搜)

题目来源:点击打开链接

题目大意:给一个一定形状的棋盘,其大小为N*N,‘#’代表可放棋子,‘.’代表不可放棋子。共k个棋子,问一共有多少摆放方法?

这是一道简单的深搜问题,直接上代码了。

/**********************************
**********深度优先搜索************
***********************************/
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>

using namespace std;
const int maxn = 8+2;//定义最大棋盘
int n;//记录棋盘真正大小
int k;//记录棋子个数
char mymap[maxn][maxn];//定义我的棋盘,记录形状
int col[maxn];//记录某一列有没有被放入棋子
int ans;//记录结果

//mybegin代表当前所处的行 mylength代表还有多少个棋子未被放入
void dfs( int mybegin, int mylength)
{
    for( int i = 0; i < n; i++)
    {
        //当前列没有被放入棋子并且可以被放入棋子
        if( col[i] == 0 && mymap[mybegin][i] == '#')
        {
            //如果只剩下一个棋子未被放入 则将它放入到mymap[mybegin][i]这个点 ans++
            if( mylength == 1)
                ans++;
            else
            {
                col[i] = 1;//将当当前棋子放入到该点(mymap[mybegin][i])
                //继续往下搜索
                for( int j = mybegin+1; j <= n-mylength+1; j++)//n-mybegin+1 = n-(mylength-1);
                    dfs(j,mylength-1);//减少了一个棋子
                col[i] = 0;
            }
        }
    }
}

int main()
{
    while( scanf("%d%d",&n,&k) == 2 && n != -1 && k != -1)
    {
        memset(col,0,sizeof(col));//初始化列标记为0,表示每一列都没有放入棋子
        ans = 0;//初始化棋子

        for( int i = 0; i < n; i++)
            scanf("%s",mymap[i]);

        for( int i = 0; i <= n-k; i++)//从第0行搜索到第n-k行,自己可以画图理解为什么这样
            dfs(i,k);

        printf("%d\n",ans);

    }

    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值