【遍历染色】【120817测试】【JSOI2007夏令营考试】题1:入门(a.pas/c/cpp)

题1:入门(a.???)

 

不是任何人都可以进入桃花岛的,黄药师最讨厌象郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。

由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第1块砖上(第1块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。

注意:瓷砖可以重复走过,但不能重复计数。

 

输入:

第1行两个正整数W和H,分别表示小路的宽度W和长度H,W和H都不大于20。

以下H行为一个H*W的字符矩阵。每一个字符代表一块瓷砖。其中,“.”代表安全的砖,“#”代表不安全的砖,“@”代表第1块砖。

 

输出:

输出一行,只包括一个数,即你从第1块砖开始所能安全走过的最多的砖块个数(包括第1块砖)。

 

样例输入:

11 9

.#.........

.#.#######.

.#.#.....#.

.#.#.###.#.

.#.#..@#.#.

.#.#####.#.

.#.......#.

.#########.

...........

 

样例输出:

59

 

当时考试的时候脑子有点不清醒,没想到染色,写了个动规错了。。。

这一题直接一个深搜,进行染色遍历即可

C++ Code

#include<cstdio>
#include<string>
using namespace std;
#define MAXN 30

const int dx[5]={0,0,0,1,-1};
const int dy[5]={0,1,-1,0,0};
int n,m,tx,ty,sum;
bool map[MAXN][MAXN],h[MAXN][MAXN];

void dfs(int x,int y)
{
    int newx,newy;
    for(int i=1;i<=4;i++)
    {
        newx=x+dx[i];newy=y+dy[i];
        if(map[newx][newy] && !h[newx][newy])
        {
            h[newx][newy]=true;
            sum++;
            dfs(newx,newy);
        }
    }
}

int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%d%d",&m,&n);//n行m列
    int i,j;
    char ch[50];
    gets(ch);//读完数字跳行
    int x;
    memset(map,0,sizeof(map));
    for(i=1;i<=n;i++)
    {
        gets(ch);
        for(j=0;j<m;j++)
        {
            if(ch[j]=='@'){tx=i;ty=j+1;}
            if(ch[j]=='#') map[i][j+1]=false;
            else map[i][j+1]=true;
        }
    }
    dfs(tx,ty);
    printf("%d",sum);
    return 0;
}

 

 

posted @ 2012-08-21 09:23  jiangzh  阅读(339)  评论(0编辑  收藏  举报