CSP2

Detalles del tema

Este problema requiere programación para implementar un programa para dibujar
  imágenes con caracteres ASCII, que admite las siguientes dos operaciones: Dibujar línea: proporcione las coordenadas de dos puntos finales y dibuje un segmento de línea que conecte los dos puntos finales. En aras de la simplicidad, asegúrese de que cada segmento de línea a dibujar sea horizontal o vertical. El segmento de línea horizontal se dibuja con el carácter-, y el segmento de línea vertical se dibuja con el carácter |. Si un segmento de línea horizontal y un segmento de línea vertical se cruzan en una determinada posición, la posición de intersección se reemplaza por el carácter +.
  Ÿ Relleno: proporcione las coordenadas de la posición inicial del relleno y el carácter que se va a llenar. Comenzando desde la posición inicial, llene la posición adyacente con el carácter hasta que se encuentre con el borde del lienzo o el segmento de línea que se ha dibujado. Tenga en cuenta que la posición adyacente aquí solo necesita considerar las cuatro direcciones de arriba, abajo, izquierda y derecha. Como se muestra en la siguiente figura, el carácter @ solo es adyacente a 4 caracteres *.
  . .
  @
  .
.
Formato de entrada:
la primera línea tiene tres enteros m, n y Q. myn representan el ancho y la altura del lienzo, respectivamente, en caracteres. q representa el número de operaciones de dibujo.
  Línea 2 a línea q + 1, cada línea es una de las siguientes dos formas:
  Ÿ 0 x1 y1 x2 y2: representa la operación de dibujar un segmento de línea, (x1, y1) y (x2, y2) son los dos extremos del segmento de línea , Satisfacer x1 = x2 e y1 ≠ y2, o y1 = y2 y x1 ≠ x2.
  Ÿ 1 xyc: indica la operación de llenado, (x, y) es la posición de inicio, para garantizar que no caerá en ningún segmento de línea existente; c es el carácter de llenado, es una letra mayúscula.
  La esquina inferior izquierda del lienzo es la ubicación con las coordenadas (0, 0), la dirección hacia la derecha es el aumento de la coordenada x, y la dirección hacia la coordenada y es el aumento. Las operaciones q se ejecutan en el orden dado por los datos. Inicialmente, todas las posiciones en el lienzo eran caracteres (punto decimal).
Formato de salida: la
salida tiene n líneas, con m caracteres en cada línea, que indican los resultados del dibujo obtenidos después de realizar estas operaciones q en secuencia.
: :
Entrada:
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4
Salida 2 C :
……
± ------- +……
| CCCCCCCC |……
| CC ± ---- +
…… | CC |
…… | CC |
…… | CC |
…… | CC | ...
... | CC | ...
... | CC ± ---- + ...
... | CCCCCCCC | ...
... ± ------- + ...
...

Ideas

Un pozo aquí es el problema de la conversión de coordenadas. Dibuje la matriz bidimensional. El (n-1,0) es el origen. A la derecha está la dirección del eje x cada vez más grande, que es la dirección del índice de la columna cada vez más grande. Arriba es y. La dirección en la que el eje se hace más grande es también la dirección en la que el índice de la fila se hace más pequeño, por lo que es mucho más importante decidir si se dibujan líneas horizontales y verticales. Para el relleno, elegí el método bfs, y la conversión de coordenadas también debe considerarse aquí. Aquí, los valores de las coordenadas x, y se pueden intercambiar y luego recorrer con '|', '-', '+' ym, n como condiciones de contorno Rellenar, de modo que solo necesite generar en orden inverso al operar la salida

Código

#include <bits/stdc++.h>

using namespace std;

struct point
{
	int x;
	int y;
};

point t;
point de[4]={{0,1},{0,-1},{-1,0},{1,0}};
char mp[102][102],c;
bool vis[102][102];
int n,m,q,cz;
int xp1,xp2,yp1,yp2;
queue<point>qe;

bool can(int a,int b)
{
	if(vis[a][b]==1||a<0||a>=m||b<0||b>=n||mp[a][b]=='|'||mp[a][b]=='+'||mp[a][b]=='-')
	return 0;
	return 1;
}
void fill(int a,int b,char c)
{
	memset(vis,0,sizeof(vis)); 
	qe.push({a,b});
	while(!qe.empty())
	{
		t=qe.front();
		qe.pop(); 
		for(int i=0;i<4;i++)
		{
			xp2=t.x+de[i].x;
			yp2=t.y+de[i].y;
			if(can(xp2,yp2))
			{
				vis[xp2][yp2]=1;
				mp[xp2][yp2]=c;
				qe.push({xp2,yp2});
			}
		}
	} 
}
void draw(int a1,int b1,int a2,int b2)
{ 
	if(a1==a2)
	{
        if(b1>=b2)
        {
            int temp=b1;b1=b2;b2=temp;
        }
		for(int i=b1;i<=b2;i++)
		{
			if(mp[i][a1]=='-'||mp[i][a1]=='+')mp[i][a1]='+';
			else mp[i][a1]='|';
		 } 
	}
	else
	{
        if(a1>=a2)
        {
           int temp=a1;
            a1=a2;
            a2=temp;
        }
		for(int i=a1;i<=a2;i++)
		{
			if(mp[b1][i]=='|')mp[b1][i]='+';
			else mp[b1][i]='-';
		} 	
	 } 
}
int main()
{
	scanf("%d%d%d",&m,&n,&q);
     memset(mp,'.',sizeof(mp));
	while(q--)
	{
		scanf("%d",&cz);
		if(cz){ 
		    cin>>xp1>>yp1>>c;
 			fill(xp1,yp1,c);

		}
		else{ 
			cin>>xp1>>yp1>>xp2>>yp2; 
			draw(xp1,yp1,xp2,yp2);		
		}
	}
   
	for(int i=n-1;i>=0;i--)
    for(int j=0;j<m;j++)
	{
		printf("%c",mp[i][j]);
		if(j==m-1)printf("\n");
	} 
	return 0;
}

Resumen

Esta pregunta es realmente demasiado evasiva, hizo mi índice de matriz, los valores de las coordenadas son tontos e indistinguibles, y es realmente útil para dibujar imágenes. Al juzgar si las coordenadas cruzan el límite, myn se invierten, y 70 puntos se hacen varias veces Asqueroso

20 artículos originales publicados · Me gusta3 · Visitas 455

Supongo que te gusta

Origin blog.csdn.net/qq_44893580/article/details/104982165
Recomendado
Clasificación