2018 Lanqiao Cup Pregunta I --- Calentamiento global

calentamiento global

Tiene una imagen de una determinada zona de mar con NxN píxeles, "." Significa océano y "#" significa tierra, como se muestra a continuación:

.......
.##....
.##....
....##.
..####.
...###.
.......

Entre ellos, un pedazo de tierra conectado en cuatro direcciones "arriba, abajo, izquierda y derecha" forma una isla. Por ejemplo, hay 2 islas en la imagen de arriba.

Dado que el calentamiento global ha provocado que el nivel del mar suba, los científicos predicen que en las próximas décadas, un área de píxeles en el borde de la isla quedará sumergida por agua de mar. Específicamente, si un píxel terrestre está adyacente al océano (hay un océano entre los cuatro píxeles adyacentes arriba, abajo, izquierda y derecha), estará sumergido.

Por ejemplo, el área del mar en la imagen de arriba será la siguiente en el futuro:

.......
.......
.......
.......
....#..
.......
.......

Calcule: según la predicción de los científicos, cuántas islas en la foto estarán completamente sumergidas.
[Formato de entrada] La
primera línea contiene un número entero N. (1 <= N <= 1000) Las
siguientes N filas y N columnas representan una foto del área del mar.
La imagen garantiza que los píxeles de la primera fila, la primera columna, la fila N y la columna N son todos océanos.
[Formato de salida]
Un número entero representa la respuesta.
【Muestra de entrada】

7 
.......
.##....
.##....
....##.
..####.
...###.
.......  

[Salida de muestra]

1  

Acuerdo de recursos:
consumo máximo de memoria (incluidas las máquinas virtuales) <256
M consumo de CPU <1000 ms

Idea: busque profundamente en las islas y luego procese el área sumergida para hacer un juicio final. Vale la pena señalar que puede haber más islas después de que el agua de mar se haya erosionado. Es como si este ejemplo fuera propenso a errores.

Estoy registrando de qué puntos está compuesta la isla original, y veo si estos puntos todavía están vivos después de la erosión.

Código:

#include<stdio.h>
#include<string.h>
#define  SIZE  1001

int dir[4][2]={
    
    //记录上下左右走的数组 
	{
    
    0,1},
	{
    
    0,-1},
	{
    
    1,0},
	{
    
    -1,0}
};

char M[SIZE][SIZE];//存储图的二维矩阵 
int M_mark[SIZE][SIZE];//是否已经被dfs访问过 
int M_del[SIZE][SIZE];//是否该被被侵蚀函数 

void del_mark(int i,int j,int n){
    
    //单次删除标记 
	if(M[i][j]=='#'){
    
    
		if(i==1&&j==1){
    
    //左上角 
			if(M[i+1][j]=='.'||M[i][j+1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(i==1&&j==n){
    
    //右上角 
			if(M[i][j-1]=='.'||M[i+1][j]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(i==n&&j==1){
    
    //左下角 
			if(M[i-1][j]=='.'||M[i][j+1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(i==n&&j==n){
    
    //右下角 
			if(M[i-1][j]=='.'||M[i][j-1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(i==1){
    
    //第一行 
			if(M[i][j-1]=='.'||M[i][j+1]=='.'||M[i+1][j]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(i==n){
    
    //第n行 
			if(M[i][j-1]=='.'||M[i][j+1]=='.'||M[i-1][j]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(j==1){
    
    //第一列 
			if(M[i+1][j]=='.'||M[i-1][j]=='.'||M[i][j+1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else if(j==n){
    
    //第n列 
			if(M[i+1][j]=='.'||M[i-1][j]=='.'||M[i][j-1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}else{
    
    //最一般的情况 
			if(M[i+1][j]=='.'||M[i-1][j]=='.'||M[i][j-1]=='.'||M[i][j+1]=='.')M_del[i][j]=1;
			else M_del[i][j]=0;
		}
	}else{
    
    
		M_del[i][j]=0;
	}
}

void del(int n){
    
    //侵蚀函数 
	memset(M_del,0,sizeof M_del);
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			del_mark(i,j,n);
		}
	}
	
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			if(M_del[i][j]==1){
    
    
				M[i][j]='.';//岛屿变为海域 
			}
		}
	}
	return ;
}

void dfs(int i,int j,int n){
    
    //dfs函数 
	if(i<1||j<1||i>n||j>n)return ;
	if(M_mark[i][j]==1)return ;
	if(M[i][j]=='.')return ;
	
	M_mark[i][j]=1;
	
	for(int i=0;i<4;i++){
    
    
		int ii=i+dir[i][0];
		int jj=j+dir[i][1];
		dfs(ii,jj,n);
	}
	return ;
}

int sum(int n){
    
    //求和函数 
	int cnt=0;
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			if(M[i][j]=='#'&&M_mark[i][j]==0){
    
    
				dfs(i,j,n);
				cnt++;
			}
		}
	}
	return cnt;
}

int main(){
    
    
	int n;
	scanf("%d",&n);
	getchar();
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=n;j++){
    
    
			scanf("%c",&M[i][j]);
		}
		getchar();
	}	
	del(n);
	int ans=sum(n);
	printf("%d",ans);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/timelessx_x/article/details/115238297
Recomendado
Clasificación