Lianliankan HDU-1175 (Amplitud primera búsqueda bfs)

Este es un enlace de pregunta de búsqueda

Lianliankan

Creo que mucha gente ha jugado "Lianliankan". No importa si no has jugado, déjame presentarte las reglas del juego: en un tablero de ajedrez, hay muchas piezas de ajedrez. Si dos piezas idénticas pueden estar conectadas por una línea (esta línea no puede pasar a través de otras piezas), y el número de vueltas de la línea no excede el doble, estas dos piezas pueden eliminarse del tablero. Lo siento, porque no he jugado a Lianliankan antes, y consulté a mis compañeros de clase, la conexión no se puede omitir desde el exterior, pero de hecho esto está mal. Ahora que ha causado una catástrofe, solo se pueden cometer errores y la conexión no se puede rodear desde el exterior.

El jugador hace clic en dos piezas de ajedrez una tras otra con el mouse, tratando de eliminarlas, y luego el fondo del juego determina si las dos casillas se pueden eliminar. Ahora tu tarea es escribir este programa en segundo plano.
Este programa de fondo.

Hay
varios grupos de datos de entrada . La primera fila de cada grupo de datos tiene dos números enteros positivos n, m (0 <n <= 1000, 0 <m <1000), que representan respectivamente el número de filas y columnas del tablero de ajedrez. En las siguientes n filas, cada fila tiene m enteros no negativos que describen la distribución de cuadrícula del tablero de ajedrez. 0 significa que no hay peón en esta posición y un número entero positivo indica el tipo de peón. La siguiente línea es un entero positivo q (0 <q <50), lo que indica que hay q consultas a continuación. En las siguientes q filas, hay cuatro enteros positivos x1, y1, x2, y2 en cada fila, lo que significa preguntar si las piezas de la fila x1 y la columna y1 y las piezas de la fila x2 y la columna y2 pueden eliminarse. Cuando n = 0, m = 0, la entrada finaliza.

Nota: No hay priorización entre las consultas, ¡todas son para el estado actual!

Salida
de cada conjunto de datos de entrada correspondiente a una línea de salida. Si se puede eliminar, emitirá "SÍ", si no puede, emitirá "NO".

Entrada de muestra 3 4
1 2 3 4
0 0 0 0
4 3 2 1
4
1 1 3 4
1 1 2 4
1 1 3 3
2 1 2 4
3 4
0 1 4 3
0 2 4 1
0 0 0 0
2
1 1 2 4
1 3 2 3
0 0
Salida de muestra SÍ
NO
NO
NO
NO

Al principio, usé una búsqueda profunda para escribir esta pregunta, pero por supuesto se agotó el tiempo. Con Guangsou, la idea principal es registrar cuántos giros cuando llega a este punto, de qué dirección es cuando llega a este punto, y la matriz de marcadores ya no registra si ha estado allí, sino que registra todos los puntos en los que han visitado El número mínimo de vueltas.

Código

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
struct muban
{
    
    
 	int x;
 	int y;
 	int zh;
 	int turn;
 } s,temp;
int a[1005][1005];
int book[1005][1005];
int go[4][2]={
    
    {
    
    0,1},{
    
    1,0},{
    
    -1,0},{
    
    0,-1}};
int flag,n,m;
int bfs(int p,int q,int g,int h)
{
    
    
 	memset(book,15,sizeof(book));
 	int i;
 	queue <muban> qq;
 	s.x=p;
 	s.y=q;
 	s.zh=0;
 	s.turn=-1;
 	qq.push(s);
 	while(!qq.empty())
 	{
    
    
  		s=qq.front();
  		qq.pop();
  		if(s.x==g&&s.y==h&&s.zh<=2)
  		return 1;
  		for(i=0;i<4;i++)
  		{
    
    
   			temp=s;
   			temp.x=temp.x+go[i][0];
   			temp.y=temp.y+go[i][1];
   			if(temp.x>=1&&temp.x<=n&&temp.y>=1&&temp.y<=m&&(a[temp.x][temp.y]==0||(temp.x==g&&temp.y==h)))
   			{
    
    
    				if(temp.turn!=-1)
    				{
    
    
     					if(temp.turn!=i)
     					{
    
    
      						temp.turn=i;
      						temp.zh++;
     					}
    				}
    				else
    				temp.turn=i;
    				if(temp.zh>2)
    				continue;
    				if(temp.zh<=book[temp.x][temp.y])
    				{
    
    
     					book[temp.x][temp.y]=temp.zh;
     					qq.push(temp);
    				}
   			}
  		}
 	}
 	return 0;
}
int main()
{
    
    
 	while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
 	{
    
    
  		int i,j;
  		for(i=1;i<=n;i++)
  		{
    
    
  			for(j=1;j<=m;j++)
   			{
    
    
    				scanf("%d",&a[i][j]);
   			}
  		}
  		int xun;
 		scanf("%d",&xun);
  		while(xun--)
  		{
    
    
   			int p,q,g,h;
   			flag=1;
   			scanf("%d%d%d%d",&p,&q,&g,&h);
   			if(a[p][q]!=a[g][h])//要先排除起点终点不同
   			flag=0;
   			if(a[p][q]==0||a[g][h]==0)//排除起点或终点为0的
   			flag=0;
   			if(p==g&&q==h)//排除起点终点相同的
   			flag=0;
   			if(flag==1)
   			flag=bfs(p,q,g,h);//进入广搜
   			if(flag)
   			printf("YES\n");
   			else
   			printf("NO\n");
  		}
 	}
 	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Huo6666/article/details/105591674
Recomendado
Clasificación