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的主要内容,如果未能解决你的问题,请参考以下文章