码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1312 Red and Black

时间:2020-02-02 23:51:48      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:for   ret   inline   code   show   problem   read   getch   using   

题目传送门

#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\n",ans);//输出 
    }
    return 0;
}

hdu 1312 Red and Black

标签:for   ret   inline   code   show   problem   read   getch   using   

原文地址:https://www.cnblogs.com/ForeverOIer/p/12254082.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!