• 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的。

  • 相关阅读:
    XStream
    Tomcat权威指南-读书摘要系列2
    《人性的弱点》
    HttpClient
    Spring整合Mybatis
    Tomcat权威指南-读书摘要系列1
    MT【88】抽象函数
    MT【87】迭代画图
    MT【86】两个绝对值之和最大
    MT【85】正整数系数
  • 原文地址:https://www.cnblogs.com/Mangata/p/12230326.html
Copyright © 2020-2023  润新知