327. Campo de maíz

La tierra del granjero John consta de pequeños cuadrados de M×N y ahora quiere plantar maíz en esa tierra.

Desafortunadamente, algunas partes de la tierra son estériles y no se pueden plantar.

Además, los terrenos adyacentes no se pueden sembrar con maíz al mismo tiempo, lo que significa que no habrá un borde común entre todos los cuadrados donde se planta maíz.

Ahora, dado el tamaño del terreno, averigüe cuántos métodos de plantación existen.

No plantar nada en la tierra también es una manera.

formato de entrada

La línea 1 contiene dos números enteros M y N.

Línea 2..M+1: Cada línea contiene N números enteros 0 o 1, que se utilizan para describir la condición de toda la tierra, 1 significa que la tierra es fértil y 0 significa que la tierra es estéril.

formato de salida

Genere el valor del método de siembra total módulo 108.

rango de datos

1≤M,N≤12

Muestra de entrada:

2 3
1 1 1
0 1 0

Salida de muestra:

9

Idea de tema:

Compresión de estado:

estado en binario

estado de la tienda como un número decimal

1. Todos los estados para cada fila. !(i&i>>1)

2. El estado de la fila anterior y de la fila actual.

indicación de estado

f[i][a] = (f[i][a] + f[i - 1][b])

Código de solución:

#include<bits/stdc++.h>
using namespace std;
const int M = 1e9;
int n, m;
int g[14];
int cnt;
int s[1 << 14];
int f[14][1 << 14];
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			int x;
			cin >> x;
			g[i] = (g[i] << 1) + x;
		}
	}

	for (int i = 0; i < (1 << m); i++) {
		if (!(i & i >> 1)) {
			s[cnt++] = i;
		}
	}
	f[0][0] = 1;

	for (int i = 1; i <= n + 1; i++) {
		for (int a = 0; a < cnt; a++) {
			for (int b = 0; b < cnt; b++) {
				if ((s[a] & g[i]) == s[a] && !(s[a] & s[b])) {
					f[i][a] = (f[i][a] + f[i - 1][b]) % M;
				}
			}
		}
	}

	printf("%d\n", f[n + 1][0]); 
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/128559334
Recomendado
Clasificación