HDU-1312题解(DFS)

HDU-1312-DFS

Written by Void-Walker    2020-02-01 09:09:25

1.题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1312

2.题目大意:

有一个矩形房间,房间里有红砖块(‘#’)和黑砖块(‘.’)组成。现在有一个人站在一个@上面,他只能走黑色方块,现在问他最多能经过多少黑色方块。(他的初始位置也算)

3.题目思路:

这道题是一个非常经典的深度优先搜索。我们从他的初始位置开始搜索:

for(y=0;y<hy;y++)
{
    for(x=0;x<wx;x++)
    {
        cin>>room[x][y];
        if(room[x][y]==‘@‘)
        {
                    dx=x;
            dy=y;
        }
    }
}

注意,认真读题,我们输入的两个尺寸参数第一个是数列,第二个才是横行,输入的时候要小心。之后,我们获得了初始位置就可以开始DFS了。

void DFS(int dx,int dy)
{
    room[dx][dy]=‘#‘;
    num++;
    for(int i=0;i<4;i++)
    {
        int newx=dx+dirx[i];
        int newy=dy+diry[i];
        if(CHECK(newx,newy) && room[newx][newy]==‘.‘)
        {
            DFS(newx,newy);
        }
    }
}

我们采用了一种非常巧妙的方法,每次搜索到一个点的时候,将这个点统一标记为红点,避免重复搜索。

这里的DFS非常经典,不包含其他拐弯抹角的地方,所以思想难度相对简单。

最后给出完整的代码:

#include<bits/stdc++.h>
using namespace std;
char room[21][21];
int dirx[5]={0,1,-1,0};
int diry[5]={1,0,0,-1};
int i,j;
int wx,hy,num;
bool CHECK(int x,int y)
{
    if(x<wx && x>=0 && y<hy && y>=0 ) return true;
    else return false;
}
void DFS(int dx,int dy)
{
    room[dx][dy]=‘#‘;
    num++;
    for(int i=0;i<4;i++)
    {
        int newx=dx+dirx[i];
        int newy=dy+diry[i];
        if(CHECK(newx,newy) && room[newx][newy]==‘.‘)
        {
            DFS(newx,newy);
        }
    }
}
int main()
{
    int x,y,dx,dy;
    while(cin>>wx>>hy)
    {
        if(wx==0 && hy==0)
        {
            break;
        }
        for(y=0;y<hy;y++)
        {
            for(x=0;x<wx;x++)
            {
                cin>>room[x][y];
                if(room[x][y]==‘@‘)
                {
                    dx=x;
                    dy=y;
                }
            }
        }
        num=0;
        DFS(dx,dy);
        cout<<num<<endl;
    }
} 

原文地址:https://www.cnblogs.com/Warframe-Gauss/p/12247607.html

时间: 2024-10-16 18:31:09

HDU-1312题解(DFS)的相关文章

HDU 1312:Red and Black(DFS搜索)

HDU 1312:Red and Black Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From

HDU 1312 ----- Red and Black 入门搜索 DFS解法

HDU 1312 ----- Red and Black  入门搜索  http://acm.hdu.edu.cn/showproblem.php?pid=1312 /*HDU 1312 ----- Red and Black 入门搜索 */ #include <cstdio> int n, m; //n行m列 int cnt, startx, starty; char mapp[25][25]; /*找一个连通的区域里可以走的块*/ void dfs(int x, int y){ if (x

hdu 1312 DFS算法简单题

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 此题与油田那题很像是练习深搜的好题,题意是从"@"开始,遍历整个图,找到连接的 "."有多少个 但要考虑变化,简单处理下就行了,主要是斜角的不要了,而且判断结束方式也不一样 具体看代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

HDU 1312 Red and Black(bfs,dfs均可,个人倾向bfs)

题目代号:HDU 1312 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20820    Accepted Submission(s): 12673 Problem Description There i

HDU 1312 Red and Black (搜索)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9795    Accepted Submission(s): 6103 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore

hdu 1312 Red and Black(BFS水题)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9684    Accepted Submission(s): 6021 Problem Description There is a rectangular room, covered with square tiles. Each tile is colore

HDU 4921 Map DFS+状态压缩+乘法计数

算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久,其实因为只能取某个链的前缀,所以直接取链长加+1 然后相乘即可,当然因为会出现都是空的那种情况,要去掉,全部乘完之后,要-1 然后就是算权值了,权值等于当前加进来的点的总和 以及 等级相同的点的加成,并不是特别好算,这时候考虑每个状态下的点对全局的贡献,对,就是这个思想,用状态压缩来表示状态,然后这

HDU 1312 Red and Black (dfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17773    Accepted Submission(s): 10826 Problem Description There is a rectangula

hdu 1312(DFS)

Red and Black Tme Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18126    Accepted Submission(s): 11045 Problem Description There is a rectangular room, covered with square tiles. Each tile is color

hdu 1312 Red and Black(dfs)

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char mat[50][50]; int n,m; int ans; int op[4][2]={0,1,0,-1,1,0,-1,0}; bool ok(int x,int y) { if(0<=x&&x<n&&0<=y