dfs resuelve HDU 1312 rojo y negro

dfs resuelve el problema del agua de búsqueda HDU 1312 Red and Black

Hay una sala rectangular con azulejos cuadrados. Cada textura es roja o negra. De pie solo sobre un azulejo negro. De una textura, puede pasar a una de las cuatro texturas adyacentes. Pero no puede moverse sobre la textura roja, solo puede moverse sobre la textura negra.
Escribe un programa para contar el número de cuadrados negros que puede alcanzar repitiendo las acciones descritas anteriormente.

Entrada La
entrada consta de varios conjuntos de datos. El conjunto de datos comienza con una fila que contiene dos números enteros positivos W y H; W y H son el número de mosaicos en las direcciones xey, respectivamente. W y H no superan los 20.
Hay H filas en el conjunto de datos y cada fila contiene W caracteres. Cada carácter representa el color de una textura, como se muestra a continuación.
".-un mosaico negro
" # "- una pegatina roja
" @ "- una persona acostada sobre un mosaico negro (solo aparece una vez en el conjunto de datos)

Salida
Para cada conjunto de datos, su programa debe generar una línea que contenga el número de texturas que puede alcanzar desde la textura inicial (incluido él mismo).
La idea principal del tema es que puedes caminar desde el punto marcado con @ hasta el lugar marcado con '.', Y se intercepta el lugar con @. Pregunta la longitud del mapa completo que puedes caminar.

El código de CA es el siguiente

#include<stdio.h>
#include<string.h>
int w,h;//输入地图的大小 
char m[25][25];//地图大小 
int stax,stay;//开始探索的起始,stax,stay 
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};//对该点进行上下左右四个点方向探索 
int sum=0;
void dfs(int x, int y)
{
    int i,j;
    int x1,y1;
    for(i=0;i<4;i++)
    {
        x1=x+dx[i];
        y1=y+dy[i];//下左右依次移动 
        if(m[x1][y1]=='.'&&x>0&&x<=h&&y>0&&y<=w)
        {
         sum++;
         m[x1][y1]='#';//探索后变为#防止二次搜索 
         dfs(x1,y1);//重复探索 
        }
    }
}

int main()
{
    int i,j;
    while(scanf("%d%d",&w,&h)&&w!=0&&h!=0)
    {
        getchar();//吸收回车 
        sum=0;
        memset(m, 0, sizeof(m));
        for(i=1;i<=h;i++)//输入地图并标记起点 
        {
            for(j=1;j<=w;j++)
            {
                scanf("%c", &m[i][j]);
                if(m[i][j]=='@')
                {
                    stax=i;
                    stay=j;
                    m[i][j]='#';//起点算一个'.',标记后将它变成# 
                }
            }
            getchar(); 
        }
        dfs(stax,stay);
        printf("%d\n", sum+1);
    }
    return 0; 
}

Supongo que te gusta

Origin blog.csdn.net/zhang_xiao__/article/details/113182184
Recomendado
Clasificación