1. Se citeste un numar natural n, reprezentand dimensiunea unei table de sah. Sa se genereze toate solutiile de a aseza n ture pe tabla de sah astfel incat turele sa nu se atace intre ele.
2. Se citesc 2 numere n si p si apoi numele a n copii. Sa se genereze toate echipele care se pot forma luand cate p copii din cei n.
urgent dau coroana
Răspunsuri la întrebare
Problema damelor :
#include <iostream>
using namespace std;
int v[20], n, index = 1;
int solutie(int k){
if (k==n) return 1;
return 0;
}
void tipar(){
int i,j;
cout << "\n\t Solutie #" << index++ << " : ";
for (i=1;i<=n;i++){
cout << endl;
for (j=1;j<=n;j++){
if(j==v[i]) cout << "R ";
else cout << "0 ";
}
}
}
int valid(int k){
int i,abs;
for(i=1;i<k;i++){
//cout << "Test : " << i<< k <<" -> "<<v[i] << v[k]<<endl;
//Test coloana
if(v[i]==v[k]) return 0;
//Test diagonala
abs = v[k]-v[i];
if(abs<0) abs *=-1;
if(k-i == abs) return 0;
}
return 1;
}
void BK(int k) {
int i;
for (i=1;i<=n;i++){
v[k]=i;
if (valid(k)==1){
if (solutie(k)==1)
tipar();
else
BK(k+1);
}
}
}
int main()
{
cout << "Numarul de regine : ";
cin >> n;
BK(1);
if(index==1) cout << "Nu exista solutii.";
}
Iar problema cealalta e un simplu combinari de n luate cate k la care memorezi numele copiilor in vector si il afisezi in functia de afisare. Mai exact in loc de v[i] afisezi nume[v[i]].
char nume[100][10] //Numele
int n,p;
void tipar(){
int i;
cout << endl;
for(i=1;i<=p;i++)
cout << nume[v[i]] << " ";
}
void back(int k){
for (i=k;i<=n;i++){
if (k==p) tipar();
else back(k+1);
}
int main(){
cin >> n >> p;
for(i=1;i<=n;i++)
cin >> nume[i];
back(1);
}