Red and Black POJ

来源:互联网 发布:mac口红是什么牌子 编辑:程序博客网 时间:2024/05/29 18:49

分析:相当于走迷宫,黑色格子是路,红色格子是墙,每次到达一个未到达过的格子时计数,原点也算是一个!!每次可以走上下左右四个方向,求能走到的最大的黑色格子数。

思路:用深度优先遍历从原点起始,一直到遍历所有能到达的格子。注意走过的格子用新符号标记,只要非"."即可。在这里用"#"标记。(也可以再开一个book数组标记走过的为1,没走的为0,但对于本题 没必要这么麻烦,以后的dfs会用到)。

AC代码:

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
char g[30][30];
int l,h;
int sx,sy;
int ans;
   
int dfs(int x,int y)
{
   int  ans=0;//!!!此处注意重新定义一个ans,而不是赋值0(方法一)。

//方法二:此处可以不重新定义ans,只需要将ans+=dfs(nx,ny);改为ans=dfs(nx,ny);
    int dx[5]={0,1,0,-1};
    int dy[5]={1,0,-1,0};
    for(int i=0;i<4;i++)
    {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<h&&nx>=0&&ny<l&&ny>=0&&g[nx][ny]=='.')
        {
            ans++;
            g[nx][ny]='#';
            ans+=dfs(nx,ny);
        }
    }
    return ans;
}
void solve()
{
    for(int i=0;i<h;i++)
        for(int j=0;j<l;j++)
    {
        if(g[i][j]=='@')
        {
            sx=i;
            sy=j;
            break;
        }
    }
   ans=1+dfs(sx,sy);
    cout<<ans<<endl;
}




using namespace std;
int main()
{
    while(scanf("%d %d",&l,&h)!=EOF)
    {
        if(l==0&&h==0)  break;
           ans=0;          
        for(int i=0;i<h;i++)//  √            !!这样输入超限    for(int i=0;i<h;i++)   for(int j=0;j<l;j++) scanf("%c",&g[i][j]); 超限
           scanf("%s",g[i]);
         


           solve();


    }
}

原创粉丝点击