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

原文地址:https://www.cnblogs.com/YHH520/p/12230326.html

时间: 2024-11-07 23:54:54

1321:棋盘问题(深度优先搜索进阶)的相关文章

POJ 1321 棋盘问题(搜索)

题目链接:POJ 1321 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28825   Accepted: 14276 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,

POJ 1321 棋盘问题 DFS搜索

简单搜索 练习一下回溯 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <sstream> 5 #include <string> 6 #include <algorithm> 7 #include <list> 8 #include <map> 9 #include <vector> 10 #inc

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

深度优先搜索DFS (poj2386,poj1979, poj3009,poj1321,aoj0033,aoj0118)

深度优先搜索(DFS) 往往利用递归函数实现(隐式地使用栈). 深度优先从最开始的状态出发,遍历所有可以到达的状态.由此可以对所有的状态进行操作,或列举出所有的状态. 1.poj2386 Lake Couting 题意:八连通被认为连接在一起,求总共有多少个水洼? Sample Input: 10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.

深度优先搜索和广度优先搜索的深入讨论

一.深度优先搜索和广度优先搜索的深入讨论 (一)深度优先搜索的特点是: (1)从上面几个实例看出,可以用深度优先搜索的方法处理的题目是各种各样的.有的搜索深度是已知和固定的,如例题2-4,2-5,2-6:有的是未知的,如例题2-7.例题2-8:有的搜索深度是有限制的,但达到目标的深度是不定的. 但也看到,无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

深度优先搜索和广度优先搜索的比较与分(转)

深度优先搜索和广度优先搜索的深入讨论   (一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深度优先搜索法有递归以及非递归两种设计方法.一般的,当搜索深度较小.问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂.当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设

图论 - 图的遍历 - 深度优先搜索 - n皇后问题

n皇后问题 描述 n皇后问题:一个n×n的棋盘,在棋盘上摆n个皇后,满足任意两个皇后不能在同一行.同一列或同一斜线上的方案有多少种? 输入 第一行包含一个整数n. 输出 输出一个整数,表示方案数. 样例输入 4 样例输出 2 限制 一共10个测试点, 第i个测试点的n=i+4. 时间:2 sec 空间:512 MB -------------------------------------------------------------------------------------------

POJ2488 深度优先搜索+回溯

POJ2488 题目 骑士按照下图所示的走法对棋盘进行巡逻,每个格子只允许巡逻一次,且必须巡逻所有格子.给定棋盘的行数p和列数q,输出一条骑士巡逻路径,若不存在这样一条路径,则输出impossible. 图1 骑士的8种走法 骑士巡逻问题的简化版本,是哈密顿路径问题的特殊形式,但是是线性时间内可以解决的\(^{[1]}\). Sample Input 3 1 1 2 3 4 3 Sample Output Scenario #1: A1 Scenario #2: impossible Scena