Problema Cuburilor

Problemă:

Se dau n cuburi numerotate 1,2,…,n, de laturi l_i si culori c_i, i=1,2,…,n (fiecare culoare este codificată printr-un caracter).

Să se tipărească toate turnurile care se pot forma luând p cuburi din cele n disponibile, astfel încât laturile cuburilor din turn să fie în ordine crescătoare iar culorile a oricare 2 cuburi alăturate din turn să fie diferite.

Exemplu: Pentru un număr total de 4 cuburi, considerăm cuburile 1,2,3,4 de laturi (8,4,9,6) și culori (‘r’,’v’,’g’,’v’). Turnurile de câte 3 cuburi care îndeplinesc cerințele din enunț sunt [2,1,3], [4,1,3].

Implementare:

Visual_C++_Icon
Cod Sursa C++
// CuburiCPP.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include<stdio.h>
#include<string.h>
#include<iostream>
 
using namespace std;
 
int x[50],k,valid,n,m;
int dim[50];char cul[50][20];
 
void citire() /*citim datele de intrare*/
{
	cout<<"numarul total de  cuburi n= ";
	cin>>n;
	for(int i=1;i<=n;i++)
	{  
		cout<<"dimensiunea laturii pentru cubul "<<i<<": ";
		cin>>dim[i];
		cout<<"culoarea cubului "<<i<<": ";
		cin>>cul[i];
	}
	cout<<"numarul de cuburi din turn m= ";
	cin>>m;
}
 
void posibil(int k,int &valid)
{
	valid=1;
	for (int i=1;i<k;i++) 
		if(x[i]==x[k])
			valid=0; /*acelasi cub nu poate fi pus in turn de doua ori*/
	if(k>1)
		if(strcmp(cul[x[k-1]],cul[x[k]])==0) 
			valid=0;/*doua cuburi alaturate nu pot avea aceiasi culoare*/
	if(k>1)
		if(dim[x[k-1]]<dim[x[k]]) 
			valid=0;/*un cub cu latura mai mare nu poate fi pus peste un cub cu latura mai mica*/
}
 
int solutie(int k)
{
	/*avem solutie cand am reusit sa asezam in turn m cuburi*/
	if(k==m)
		return 1;
	else 
		return 0;
}
 
void afisare(int k)
{
	/*afisam solutia specificand pentru fiecare cub dimensiunea laturii si culoare*/
	for(int i=1;i<=k;i++)
       cout<<x[i]<<"("<<dim[x[i]]<<" "<<cul[x[i]]<<") ";
		cout<<endl;
}
 
void back()
{
	k=1;
	x[k]=0;
	while(k>0)
	{
		valid=0;
		while(!valid && x[k]<n)
		{
			x[k]=x[k]+1;
			posibil(k,valid);
		}
		if(!valid)
			k--;
        else if(solutie(k)) 
			afisare(k);
        else 
		{
			k++;
			x[k]=0;
        }
	}
}
 
int main()
{
	citire();
	back();
	afisare(k);
	system("Pause");
}
Rezultat:
cuburi rezultat

Leave a comment