POJ2044 de previsión del tiempo --- normas estatales

Título: Pronóstico del Tiempo

URL: http://poj.org/problem?id=2044
se puede controlar es un dios de la lluvia.
Usted es un Dios compasivo, con la esperanza de la tierra en tiempos de paz puede tener suficiente lluvia, ir al mercado y los días de fiesta puede ser lleno de sol.
Usted es responsable por el control de las condiciones climáticas en un pueblo.
El pueblo como una distribución en forma de rejilla 4 x 4, dentro de cada región pueblos se numeran como se muestra a continuación:
imagen

2 tiene una nube del tamaño de 2 x, esta pieza no es la nube fuera del pueblo.

Recibirá un período razonable de tiempo para cada zona del pueblo y de fiesta horario.

En el primer día de este tiempo, la región central (6-7-10-11) va a llover.

En cada día sucesivo, puede seleccionar entre las cuatro direcciones básicas (camiones) en una sola dirección, una nube o dos plazas, o permanecer en la misma posición.

Que no permite el movimiento en diagonal.
Cualquier región no puede contener más de siete días consecutivos o no hay tiempo de lluvia.

Lluviosa situación día distinto esta vez no necesita ninguna consideración.

Formato de entrada

Puede escribir varias series de casos de prueba.

Para cada prueba, la primera fila contiene un número entero N, representa el número de días durante este tiempo.

Se hizo cargo de las líneas N, que representa a los siguientes N días del programa de feria y el festival, la i-ésima fila representa el horario i-día.

Esto a N filas, cada fila que contiene 16 dígitos (0 o 1), 0 representa un día normal, y 1 representa unas vacaciones día de feria, el i-ésimo dígito representa el caso específico de la i-ésima zona.
Separadas por un espacio entre cada fila de números.
Cuando el caso de la prueba de entrada de N = 0, se termina la entrada, y el caso de uso sin tratamiento.

Formato de salida

Cada salida de caso de prueba un número entero de 0 ó 1, puede garantizar que todo el tiempo, donde la lluvia la lluvia, menos que en el lugar equivocado, 1 es la salida.
Si no se puede garantizar la salida 0, y cada fila de resultados.

Rango de datos

1≤N≤365

de entrada de la muestra:
1
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1
0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0
0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
0
Resultado de muestra:
0
1
0
1

Esta pregunta es, de hecho, muchos de los detalles.

En primer lugar, determinar si cada región durante siete días consecutivos sin riego, de hecho, puede ser juzgado por las cuatro esquinas;

Si define las coordenadas de la situación actual de la nube, a continuación, cuando el estado en el que las cuatro esquinas de discrepancias significado de las preguntas, difícil de representar;

Si el estado es un caso en el que las coordenadas de las cuatro esquinas, y, entonces, para el mismo estado, en cuyo caso los diferentes números de días son diferentes;

En resumen, la definición: estado (tiempo, (x, y), (d1, d2, d3, d4));

Así, para una tal condición es singularidad satisfecho, es decir, para garantizar que esta condición puede ser precisa describir el estado del caso;

Siete días consecutivos, por lo que es seguro, que Octal estado comprimido (D1, D2, D3, D4 ), es decir, d1 + d2 * 8 + d3 * 64 + d4 * 512;
resto, a prestar atención a los detalles;
código como sigue:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
struct state
{
	int turn, pos, code;
	state (int x, int y, int z) : turn(x), pos(y), code(z) {}
};
const int dx[10] = {-1, 1, 0, 0, -2, 2, 0, 0}, dy[10] = {0, 0, -1, 1, 0, 0, -2, 2};
bool day[366][17], vis[366][17][4096];
int n;
bool valid(state p)
{	
	if(vis[p.turn][p.pos][p.code]) return false;
	for(int i = 0; i < 4; ++ i)
	{
		if(p.code % 8 >= 7) return false;
		p.code >>= 3;
	}
	if(day[p.turn][p.pos] || day[p.turn][p.pos + 1] || day[p.turn][p.pos + 4] || day[p.turn][p.pos + 5]) return false;
	return true;
}
bool valid(int x, int y)
{
	if(x < 0 || x > 2 || y < 0 || y > 2) return false;
	//be aware of it : The range is [0, 2] !! 
	return true;
}
bool bfs()
{
	queue <state> Q;
	int x, y;
	int p[4] = {}, tmp = 0;
	while(!Q.empty()) Q.pop();
	memset(vis, false, sizeof(vis));
	if(!valid(state(1, 6, 1 + 8 + 64 + 512))) return false;
	vis[1][6][1 + 8 + 64 + 512] = true;
	Q.push(state(1, 6, 1 + 8 + 64 + 512));
	// The coodinate must be transfered into this form (x,y) to avoid mistakes about position!!
	while(!Q.empty())
	{
		state now = Q.front(); Q.pop();
		tmp = now.code;
		for(int i = 0; i < 4; ++ i)
		{
			p[i] = tmp % 8;
			tmp >>= 3;
		}
		x = (now.pos - 1) / 4, y = (now.pos - 1) % 4;
		for(int i = 0; i < 9; ++ i)
		{
			state next = state(now.turn + 1, (x + dx[i]) * 4 + y + 1 + dy[i], 0);
			if(!valid(x + dx[i], y + dy[i])) continue;
			
			switch(next.pos)
			{
				case 1:
				{
					next.code = (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
					break;
				}
				case 3:
				{
					next.code = p[0] + 1 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
					break;
				}
				case 9:
				{
					next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[3]) * 512;
					break;
				}
				case 11:
				{
					next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[2]) * 64;
					break;
				}
				default:
				{
					next.code = p[0] + 1 + (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
					break;
				}
			}
			if(!valid(next)) continue;
			if(next.turn == n)return true;
			vis[next.turn][next.pos][next.code] = true;
			Q.push(next);
		}
	}
	return false;
}
int main()
{
	while(scanf("%d", &n) == 1)
	{
		if(!n) return 0;
		memset(day, false, sizeof(day));
		for(int i = 1; i <= n; ++ i)
			for(int j = 1; j <= 16; ++ j) scanf("%d", &day[i][j]);
		printf("%d\n", bfs());
	}
	return 0;
}/*
challenge : 1. the design of state
   			2. the extention of states
   			3. the pictures of position
*/

Supongo que te gusta

Origin www.cnblogs.com/zach20040914/p/12633195.html
Recomendado
Clasificación