Rojo y Negro (HDU1312)

tema Enlace

título Descripción

Hay una casa rectangular, el suelo está cubierto de baldosas de color rojo, negro cuadrados de dos colores. Dónde está parado en un azulejo negro, sólo se puede mover a una azulejos negros adyacentes. Por favor, escriba un programa que calcula el número total de bloques de azulejos negro se puede llegar.

Formato de entrada

Comprende una pluralidad de conjuntos de datos. La primera línea de cada conjunto de datos es dos enteros W y H, respectivamente, representa el número de baldosas direcciones X e Y. W y H son no más de 20. H en la siguiente fila, cada fila que incluye caracteres W. Cada personaje representa un color azulejo, las reglas son las siguientes:

  • azulejos negros ;: ''.
  • '#': Azulejos blancos;
  • '@': Azulejos negros, y se pone de pie en esta baldosa. La única vez que el personaje aparece en cada conjunto de datos;

Cuando se lee en una fila dos es cero, lo que indica el final de la entrada.

Formato de salida

Para cada conjunto de datos, cada línea de salida, se inicia la pantalla (incluyendo la posición inicial cuando el recuento de teja) el número de baldosas que se puede llegar desde la posición inicial.

Ejemplo de entrada

6 9
... #.
# ...
...
...
...
...
...
# @ # ...
. # # ....
0 0

Ejemplo de salida

45

pensamiento

Un típicos problemas de búsqueda, prestar atención a fin de evitar las necesidades de búsqueda transfronterizas para agregar "cerca" en sus fronteras. DFS o BFS búsqueda puede ser utilizado, el tiempo de complejidad O (nm).

fuente

versión DFS

#include <bits/stdc++.h>
#define MAXN 25
using namespace std; 
int n,m,sx,sy,cnt;
int mov[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
char g[MAXN][MAXN];
bool used[MAXN][MAXN];
void dfs(int x,int y)
{
	for(int i=0;i<4;i++){
		int xx=x+mov[i][0];
		int yy=y+mov[i][1];
		if(g[xx][yy]=='.'&&!used[xx][yy]){
			used[xx][yy]=true;
			cnt++;
			dfs(xx,yy);
		}
	}
	
}
int main()
{
	while(1){
		cin>>m>>n;
		if(n==0&&m==0)break;
		memset(used,false,sizeof(used));
		for(int i=1;i<=n;i++)	//输入数据 
			for(int j=1;j<=m;j++){
				cin>>g[i][j];
				if(g[i][j]=='@')sx=i,sy=j;
			}
		for(int i=0;i<=m+1;i++)g[0][i]=g[n+1][i]='#';	//建立上下篱笆
		for(int i=0;i<=n+1;i++)g[i][0]=g[i][m+1]='#';	//建立左右篱笆
		used[sx][sy]=true,cnt=1;	//初始化 
		dfs(sx,sy);
		cout<<cnt<<endl;
	}
	return 0;
}

versión BFS

#include <bits/stdc++.h>
#define MAXN 25
using namespace std; 
struct Node{
	int x,y;
};
int n,m,sx,sy,cnt;
int mov[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
char g[MAXN][MAXN];
bool used[MAXN][MAXN];
void bfs(int x,int y)
{
	queue<Node> q;
	memset(used,false,sizeof(used));//初始化 
	used[sx][sy]=true,cnt=1;	
	q.push(Node{sx,sy});
	while(!q.empty()){
		Node tmp=q.front();
		q.pop();
		for(int i=0;i<4;i++){
			int xx=tmp.x+mov[i][0];
			int yy=tmp.y+mov[i][1];
			if(g[xx][yy]=='.'&&!used[xx][yy]){
				used[xx][yy]=true;
				cnt++;
				q.push(Node{xx,yy});
			}
		}
	}
} 
int main()
{
	while(1){
		cin>>m>>n;
		if(n==0&&m==0)break;
		for(int i=1;i<=n;i++)	//输入数据 
			for(int j=1;j<=m;j++){
				cin>>g[i][j];
				if(g[i][j]=='@')sx=i,sy=j;
			}
		for(int i=0;i<=m+1;i++)g[0][i]=g[n+1][i]='#';	//建立上下篱笆
		for(int i=0;i<=n+1;i++)g[i][0]=g[i][m+1]='#';	//建立左右篱笆
		bfs(sx,sy);
		cout<<cnt<<endl;
	}
	return 0;
}
Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 141

Supongo que te gusta

Origin blog.csdn.net/weixin_43960284/article/details/105139746
Recomendado
Clasificación