Capítulo 3 de "Algoritmo Aha" - Enumeración y violencia

inserte la descripción de la imagen aquí


prefacio

Anteriormente aprendimos sobre la clasificación y la pila de listas enlazadas de colas, esta sección aprenderá la idea de la enumeración violenta.


Uno, número olímpico engañoso

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Tema 1

□3 x 6528 = 3□ x 8256, completa el mismo número en □ para que la ecuación sea verdadera

el código se muestra a continuación

#include<iostream>
using namespace std;
int main()
{
    
    
	for(int i=1;i<=9;++i)
	{
    
    
		if((i*10+3)*6528 == (30+i)*8256)
			cout<<i<<endl;
	}
	return 0;
}

muestra

输出:4

Tema 2

□□□ + □□□ = □□□

Complete los números 1 ~ 9 respectivamente, y cada número solo se puede usar una vez para que la ecuación sea verdadera

Por ejemplo, 173 + 286 = 459 y 286 + 173 = 459 son una posibilidad
ideas para resolver problemas
Debido a que hay 9 espacios que deben llenarse, puede usar violentamente 9 para bucles, usar a[i] para representar el número de la i-ésima cuadrícula y usar la matriz de libros para marcar si los números 1 ~ 9 han aparecido

Si se cumple que cada número aparece solo una vez, y se cumple la ecuación, total++, preste atención a la salida final de total / 2

Al mismo tiempo, para evitar la acumulación de libro[i], debe ponerse a cero antes de cada inicio

el código se muestra a continuación

#include<iostream>
using namespace std;
int a[10], book[10];
int main()
{
    
    
    int i,total = 0; //可能的情况
    for(a[1] = 1; a[1] <= 9; ++a[1])
    for(a[2] = 1; a[2] <= 9; ++a[2])
    for(a[3] = 1; a[3] <= 9; ++a[3])
    for(a[4] = 1; a[4] <= 9; ++a[4])
    for(a[5] = 1; a[5] <= 9; ++a[5])
    for(a[6] = 1; a[6] <= 9; ++a[6])
    for(a[7] = 1; a[7] <= 9; ++a[7])
    for(a[8] = 1; a[8] <= 9; ++a[8])
    for(a[9] = 1; a[9] <= 9; ++a[9])//9个格子,9个for循环 
	{
    
    
        for(i = 1; i <= 9; ++i)
            book[i] = 0;//每次归零
        for(i = 1; i <= 9; ++i)
            book[a[i]] = 1; //标记是否出现
        int sum = 0;        //统计不同数字个数
        for(i = 1; i<= 9; ++i)
            sum += book[i]; //这里不是book[a[i]]
        if(sum == 9 && a[1]*100+a[2]*10+a[3] + a[4]*100
           +a[5]*10+a[6] == a[7]*100+a[8]*10+a[9]) 
		   {
    
    
           	 	total++;
            	cout<<a[1]<<a[2]<<a[3]<<"+"<<a[4]<<a[5]<<a[6]
                <<"="<<a[7]<<a[8]<<a[9]<<endl;
           }
    }
    cout<<total/2<<endl;
    return 0;
}

2. Bombardero

inserte la descripción de la imagen aquí

¿Todavía recuerdas al "Bomberman" en la consola de juegos Xiaobawang? Usa el método de colocar bombas para destruir al enemigo
. Se puede explotar
Como ahora solo hay una bomba, todas las paredes están representadas por "#" (una bomba puede explotar este tipo de muro, pero también será bloqueado).
Los enemigos están representados por "G", y los espacios abiertos están representados por "." Las bombas solo se pueden colocar en espacios abiertos.

inserte la descripción de la imagen aquí

La x y la y en el código representan la fila x y la columna y, y el cálculo comienza desde la fila 0 y la columna 0.

Aquí hay una introducción al método de expresión de la cuadrícula para caminar:

arriba x–, abajo x++, izquierda y–, derecha y++

el código se muestra a continuación

#include<iostream>
using namespace std;
int main()
{
    
    
	char a[20][21];//存放地图
	int n=0,m=0; 
	cin>>n>>m;
	int sum,i,j;
	int map=0,p=0,q=0;
	//读入n行字符
	for(int i=0;i<n;++i)
		cin>>a[i];
	//遍历地图
	for(i=0;i<n; ++i)
	{
    
    
		for(j=0;j<m; ++j)
		{
    
    
			//首先判断这个点是不是平地,是平地才可以放炸弹
			if(a[i][j]=='.')
			{
    
    
				sum=0;//sum用来计数,所以要反复初始化为0
				//将i,j分别放入到x与y当中以便于后续的向上下左右四个方向分别统计
				//可以消灭的敌人数
				
				//统计向上可以消灭的敌人数
				int x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
    
    
					if(a[x][y]=='G') sum++;//是敌人就计数 
					x--;//继续向上统计 
				}
				
				//统计向下可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')
				{
    
    
					if(a[x][y]=='G') sum++;//是敌人就计数 
					x++;//继续向下统计 
				}
				
				//统计向左可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
    
    
					if(a[x][y]=='G') sum++;//是敌人就计数 
					y--;//继续向左统计 
				}
				
				//统计向右可以消灭的敌人数
				x=i,y=j;
				while(a[x][y]!='#')//判断是不是墙,如果不是墙就继续 
				{
    
    
					if(a[x][y]=='G') sum++;//是敌人就计数 
					y++;//继续向右统计 
				}
				
				if(sum>map)
				{
    
    
					map=sum;//保存最大值
					p=i;//保存坐标
					q=j;//保存坐标
				}
			}
		}
	}
	printf("将炸弹放在(%d, %d)处,最多可以消灭%d个敌人",p,q,map);
	return 0;
}
输入:
13 13
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.###
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############

输出:将炸弹放在(9, 9)处,最多可以消灭8个敌人

tiempo para pensar

Pensando, si la pared del mapa (6, 11) se cambia a terreno plano, el villano se parará en (3, 3) por defecto

inserte la descripción de la imagen aquí
La bomba se coloca en (1, 11) y puede destruir hasta 11 enemigos, pero el villano no puede alcanzar (1, 11) en absoluto.

La respuesta correcta debe colocarse en (7, 11), que puede destruir a 10 enemigos.¿Cómo resolver este problema?
Abordaré este problema en el blog del Capítulo 4 de "Algoritmo Aha"

3. La ecuación de la cerilla

Xiaoheng tiene n(n <= 24) fósforos y espera deletrear una ecuación en la forma A + B = C. A, B y C en la ecuación son todos números enteros deletreados con fósforos (si el número no es 0, el bit más alto no es 0), la ortografía de los números 1 ~ 9 se muestra en la siguiente figura

Requerir:

1, + y = cada uno necesita dos coincidencias

2. Si A != B, entonces A + B = C y B + A = C se consideran ecuaciones diferentes (A, B, C son todas mayores que 0)

3. Se deben usar todos los fósforos

#include<iostream>
using namespace std;
int fun(int x) //写个判断火柴数的函数
{
    
    
    int a[10] = {
    
    6,2,5,5,4,5,6,3,7,6}; //单个数字对应的火柴数
    int sum = 0; //火柴数
    while(x / 10 != 0) 
    {
    
    
        sum += a[x%10]; //敲重点
        x /= 10;
    }
    sum += a[x]; //此时x为个位数
    return sum;
}
int main()
{
    
    
    int n, c, all = 0;
    cin>>n; //总的火柴数
    for(int i=0;i<=1111; ++i)
        for(int j=0;j<=1111; ++j) 
        {
    
    
            c=i+j; //"="右边的数
            if(fun(i)+fun(j)+fun(c)==n-4) 
            {
    
    
                cout<<i<<"+"<<j<<"="<<c<<endl;
                all++;
            }
        }
    cout<<"可以拼出"<<all<<"种不同等式"<<endl;
    return 0;
}

Cuatro, arreglo completo

Los problemas clásicos en DFS se explicarán en detalle en la siguiente sección

También puedes ver este adelanto

Aprendizaje del algoritmo AcWing—dfs


Resumir

Finalmente terminado, la siguiente sección explica el conocimiento de búsqueda.

Supongo que te gusta

Origin blog.csdn.net/congfen214/article/details/131772624
Recomendado
Clasificación