hdu 1312 Red and Black

Posted foreveroier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 1312 Red and Black相关的知识,希望对你有一定的参考价值。

题目传送门

#include<bits/stdc++.h>
using namespace std;
inline int read()//快读 
{
    int x=0,k=1;char c=getchar();
    while(c<'0' || c>'9'){if(c=='-') k=0;c=getchar();}
    while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return k?x:-x;
}
int w,h,sx,sy,ans;
char ch[30][30];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void dfs(int x,int y)//深搜 
{
    if(ch[x][y]=='.')//如果当前位置是 . 
    {
        ans++;//那么把能经过的黑块数加一 
        ch[x][y]='#';//然后把这个经过的黑块变为红块 
    }
    for(int i=0;i<4;i++)//遍历四个方向 
    {
        int nx=x+dx[i];//下一个 x 设为当前 x 加上一个 dx[i],表示向左还是向右还是不动 
        int ny=y+dy[i];//下一个 y 设为当前 y 加上一个 dy[i],表示向上还是向下还是不动 
        if(nx>=0 && nx<w && ny>=0 && ny<=h && ch[nx][ny]=='.') dfs(nx,ny);
        //如果这个 nx 在范围内,并且 ny 也在范围内,并且下一个格是 . 那么就深搜 nx,ny 
    }
}
int main()
{
    while(h=read(),w=read())//输入 
    {
        if(!w && !h) break;//如果两个数都是 0 就退出 
        ans=1;//将ans设为 1,因为 @ 也算一个黑格 
        bool f=0;//判断是否还需判断是否有 @ 
        for(int i=0;i<w;i++)//循环w行 
        {
            scanf("%s",ch[i]);//输入当前行 
            for(int j=0;!f && j<h;j++)//循环当前行的每一列 
            {
                if(ch[i][j]=='@')//如果当前格是 @ 
                {
                    sx=i;//记录 @ 的横坐标 
                    sy=j;//记录 @ 的纵坐标 
                    f=1;//把 f 设为 1,不在判断是否有 @ 
                    break;
                }
            }
        }
        dfs(sx,sy);//从起点 @ 开始深搜 
        printf("%d
",ans);//输出 
    }
    return 0;
}

以上是关于hdu 1312 Red and Black的主要内容,如果未能解决你的问题,请参考以下文章

HDU1312 Red and Black

hdu 1312 Red and Black

HDU 1312 Red and Black (dfs)

hdu--1312--Red and Black (dfs)

hdu 1312 Red and Black

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