DFS题目总结

目录

  • ZOJ 1002 Fire Net

ZOJ 1002 Fire Net

AC代码:

#include<iostream>
using namespace std;
int n;
int ans;
char map[10][10];
bool check(int x,int y);
void dfs(int point,int sum);
int main()
{
    while(scanf("%d",&n)!= EOF)
    {
        if(n==0)
            break;
        getchar();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
                scanf("%c",&map[i][j]);
            getchar();
        }
        ans = 0;
        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}
bool check(int x,int y)
{
    bool flag = true;
    for(int i=x;i>=0;i--)
    {
        if(map[i][y]==‘X‘)
            break;
        else if(map[i][y]==‘b‘)
        {
            flag = false;
            break;
        }
    }
    for(int i=y;i>=0;i--)
    {
        if(map[x][i]==‘X‘)
            break;
        else if(map[x][i]==‘b‘)
        {
            flag = false;
            break;
        }
    }
    return flag;
}
void dfs(int point,int sum)
{
    if(point == n*n)
    {
        if(sum>ans)
            ans = sum;
        return;
    }
    int x = point/n;
    int y = point%n;
    if(map[x][y]==‘.‘&&check(x,y))
    {
        map[x][y]=‘b‘;
        dfs(point+1,sum+1);
        map[x][y]=‘.‘;
    }
        dfs(point+1,sum);
}

原文地址:https://www.cnblogs.com/CuteyThyme/p/12678691.html

时间: 2024-08-29 12:45:19

DFS题目总结的相关文章

算法- 求解最大平均值的子树-经典dfs题目

给一棵二叉树,找到有最大平均值的子树.返回子树的根结点. Example 样例1 输入: {1,-5,11,1,2,4,-2} 输出:11 说明: 这棵树如下所示: 1 / -5 11 / \ / 1 2 4 -2 11子树的平均值是4.333,为最大的. 样例2 输入: {1,-5,11} 输出:11 说明: 1 / -5 11 1,-5,11 三棵子树的平均值分别是 2.333,-5,11.因此11才是最大的.参考代码: """ Definition of TreeNod

题目--oil Deposits(油田) 基础DFS(深度搜索)

上一次基本了解了下BFS,这次又找了个基本的DFS题目来试试水,DFS举个例子来说就是 一种从树的最左端开始一直搜索到最底端,然后回到原端再搜索另一个位置到最底端,也就是称为深度搜索的DFS--depth first search,话不多说,直接上题了解: Description:某石油勘探公司正在按计划勘探地下油田资源,工作在一片长方形的地域中.他们首先将该地域划分为许多小正方形区域,然后使用探测设备分别探测每一块小正方形区域内是否有油.若在一块小正方形区域中探测到有油,则标记为’@’,否则标

HDU 2514 Another Eight Puzzle(DFS)

题目链接 Problem Description Fill the following 8 circles with digits 1~8,with each number exactly once . Conntcted circles cannot be filled with two consecutive numbers.There are 17 pairs of connected cicles:A-B , A-C, A-DB-C, B-E, B-FC-D, C-E, C-F, C-G

HDU1241&amp;POJ2386 dfs简单题

2道题目都差不多,就是问和相邻所有点都有相同数据相连的作为一个联通快,问有多少个连通块 因为最近对搜索题目很是畏惧,总是需要看别人代码才能上手,就先拿这两道简单的dfs题目来练练手,顺便理一理dfs的思路,分析清楚dfs的退出递归的条件和什么时候进行递归调用是至关重要的,这两道题目不涉及回溯,对于需要回溯的题目也要清楚分析,找到回溯条件,在对一个新的状态dfs时,后面加上回溯的语句 HDU1241代码: 1 #include <cstdio> 2 #include <cstring>

DFS入门之一

深度优先搜索实现较为简单,需要控制两个因素: 1.已经访问过的元素不能再访问,在实际题目中还要加上不能访问的元素(障碍) 2.越界这种情况是不允许的 以杭电的1312 Red and Black 为例, 这是一道典型的DFS题目 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312 题目大意:'@'代表起始位置, '.' 代表黑点(可以穿越),'#' 代表红点(障碍) 要求统计最多可以覆盖多少个黑点 题目分析:确定起始位置 -> 开始DFS ->

蓝桥杯 历届试题 题目总结

后天就是蓝桥杯省赛了,今天总结一下这段时间做的蓝桥杯历届试题,还是一个一个题目的来吧!!!!!! 1,历届试题 矩阵翻硬币 这个题目说真的,我不会,在网上看了某神牛的题解答案为 ans=sqrt(n)*sqrt(m),具体怎么证明的我也不知道 2,历届试题 兰顿蚂蚁 这个题目怎么说呢,应该是送分题,直接模拟就可以了,这里就不说了. 3, 历届试题 分糖果 这个题目好像之前在哪里做过,也是一道模拟题,弄两个数组搞一下就可以了 下面是代码 #include<bits/stdc++.h> using

UVA10624 - Super Number(dfs)

题目:UVA10624 - Super Number(dfs) 题目大意:给你n和m要求找出这样的m位数,从第n位到第m位都满足前i位是可以被i整除,如果没有这样的数,输出-1.有多个就输出字典序最小的那个. 解题思路:将每个位置都用0..9枚举一下,注意第一个字符不能是0,然后dfs判断每个位置是否都满足要求.注意这里是会爆long long的,所以要取模一下.本来以为这样的做法会超时的,结果竟然过了,估计是样例数少,而且找不到的情况也比较少. 代码: #include <cstdio> #

[DFS] &amp; [BFS] poj1979 poj3009 poj3669

都比较简单,直接贴代码吧. poj1979 DFS 题目大意:给你一个二维数组,.表示可以到达,#表示障碍,@表示起始位置,问你能到达的最大地点有多少个,每次只能走上下左右 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int n, m, sx, sy, ans; int pd[30][30]; char maze[30][30]; int dx[4] = {0

HDU 1078 FatMouse and Cheese ( DP, DFS)

HDU 1078 FatMouse and Cheese ( DP, DFS) 题目大意 给定一个 n * n 的矩阵, 矩阵的每个格子里都有一个值. 每次水平或垂直可以走 [1, k] 步, 从 (0, 0) 点开始, 下一步的值必须比现在的值大. 问所能得到的最大值. 解题思路 一般的题目只允许 向下 或者 向右 走, 而这个题允许走四个方向, 所以状态转移方程为 dp(x, y) = dp(nextX, nextY) + arr(x, y); dp 代表在 x, y 的最大值. 由于 下一