semana 2 tarea 2 verter agua

Titulo

Problema de verter agua "llenar A" significa llenar la taza A, "vaciar A" significa vaciar la taza A, "verter AB" significa verter el agua de A en la taza B y vaciar la taza B o A. La entrada contiene múltiples conjuntos de datos. Cada conjunto de datos de entrada A, B, C rango de datos 0 <A <= B, C <= B <= 1000, A y B son relativamente primos. La salida de su programa consistirá en una serie de instrucciones. Estas líneas de salida harán que cualquier tanque contenga exactamente C unidades de agua. La salida de la última línea de cada conjunto de datos debe ser "exitosa". La línea de salida comienza en la columna 1, y no debe haber líneas en blanco ni espacios finales.

Ideas

Este es un problema típico de gráfico implícito. Para cada taza, tenemos 6 operaciones alternativas para cambiar su estado, que es equivalente a un árbol completo de 6 ramas. Atraviese este árbol para encontrar el C. requerido Aquí usamos Es una búsqueda amplia, y busca mientras calcula los puntos de la siguiente capa.
Para la ruta de acceso, aquí se usa el método de almacenar índices de matriz constantes. El índice se agrega al final de la cadena sin realizar una operación. Solo la cadena de caracteres necesita ser atravesada por carácter cuando sale

Resumen

La implementación de la cola aquí también se puede resolver en una forma que no sea cola. Al abrir una matriz grande se usa la posición relativa de los dos cursores para determinar si la cola está vacía y se logra el mismo efecto

Código

#include<stdio.h>
#include<string>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
int ca,cb,n;
bool vis[4000][4000];
struct cup{
	int a,b;
	string s;//存储路径 
	cup(){}
	cup(int qa,int qb,string ss){
		a=qa;
		b=qb;
		s=ss;
	}
};
queue<cup> qu;
string caozuo[6]={"fill A","empty A","fill B","empty B","pour A B","pour B A"};
void bfs(){
	qu.push(cup(0,0,string()));
	vis[0][0]=1;
	while(!qu.empty()){
		int a=qu.front().a;
		int b=qu.front().b;
		string s=qu.front().s;
		qu.pop();
		if(b==n||a==n){ //特判终点 
			for(int i=0;i<s.size();i++){//输出路径 
				cout<<caozuo[s[i]-48]<<endl;
			}
			cout<<"success"<<endl;
			return;
		}
		if(!vis[ca][b]){// fill A 
			qu.push(cup(ca,b,s+"0"));
			vis[ca][b]=1;
		}
		if(!vis[0][b]){//empty A
			qu.push(cup(0,b,s+"1"));
			vis[0][b]=1;
		}
		if(!vis[a][cb]){//fill B
			qu.push(cup(a,cb,s+"2"));
			vis[a][cb]=1;
		}

		if(!vis[a][0]){//empty B
			qu.push(cup(a,0,s+"3"));
			vis[a][0]=1;
		}
		int c=a+b>cb?cb:a+b;//pulll A B
		if(!vis[a+b-c][c]){//B中水量可能满也可能不满 
			qu.push(cup(a+b-c,c,s+"4"));
			vis[a+b-c][c]=1;
		}
		c=a+b>ca?ca:a+b;  //pull B A 
		if(!vis[c][a+b-c]){//A中水量可能满也可能不满 
			qu.push(cup(c,a+b-c,s+"5"));
			vis[c][a+b-c]=1;
		}

	}
	return;
}
int main() {
    while(~scanf("%d%d%d",&ca,&cb,&n)){
    	memset(vis,0,sizeof(vis));
    	while(!qu.empty())qu.pop();//多组数据将队列置空 
    	bfs();
	}
    return 0;
}

20 artículos originales publicados · elogiados 3 · visitas 463

Supongo que te gusta

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