zoukankan      html  css  js  c++  java
  • 1321:棋盘问题(深度优先搜索进阶)

    题目链接:http://bailian.openjudge.cn/practice/1321?lang=en_US

    题意:

      求在一个n*n的矩阵内棋盘内摆放k个棋子的方案,这些棋子不在同一行不在同一列去

    思路:可以通过深度优先搜索去搜寻每一行棋子与其他棋子摆放的可能方法数。

    代码如下:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    char mp[10][10];
    int vis[10];//记录每行棋子是否被搜索过 
    int sum,n,k,cnt;
    void dfs(int h)
    {
        if(cnt==k)
        {
            sum++;//满足条件方案数加一 
            return;
        }
        if(h>k)//边界条件 
        return;
        for(int i=0;i<n;i++)
        {
            if(!vis[i]&&mp[h][i]=='#')
            {
                vis[i]=1;
                cnt++;//满足条件棋子数加一。 
                dfs(h+1);//然后在下一行放棋子 
                vis[i]=0;//如果深搜失败或者棋子数目够了,则撤销标记。
                cnt--;
            }
        }
        dfs(h+1);//从下一行开始深搜。 
    }
    int main(void)
    {
        while(cin>>n>>k)
        {
            if(n==-1&&k==-1)
            break;
            sum=0;//初始化方案数 
            cnt=0;
            memset(vis,0,sizeof vis);
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>mp[i][j];
            }
        }
        dfs(0);//从第一行开始搜索。 
        printf("%d\n",sum);
    }
        return 0;
    }

    小结一下:

      此题是一道经典的深搜题,不过开始做的时候可能不会做,没有思路,多读几遍题,是在不行看看其他博主的博客,这道题还是能AC的。

  • 相关阅读:
    中间人攻击
    RSA算法详解
    Scala的自定义类型标记
    新版gitbook导出pdf
    request中跟路径有关的api的分析
    struts2初始化探索(一)
    struts2入门教学
    区块链学习笔记(五)
    区块链学习笔记(四)
    区块链学习笔记(三)
  • 原文地址:https://www.cnblogs.com/Mangata/p/12230326.html
Copyright © 2011-2022 走看看