Backtracking: Fiind data o tabla de sah nxn se cere sa se afiseze modalitatile de aranjare a n dame(regine) astfel incat doua dame sa nu fie pe aceeasi linie,coloana sau diagonala si sa se afiseze numarul de solutii gasite....nu stiu sa termin problema si asa cum e acum nu imi afiseaza nimic.
#include <iostream>
#include <cmath>
using namespace std;
int m,a[200],i,k,x[100],ev,as,n,nr,j;
void succesor(int x[],int k,int &as)
{ if(k<n)
{ as=1;
x[k]=x[k]+1;
}
else
as=0;}
void valid(int x[],int k,int &ev)
{ ev=1;
for(int i=1;i<=k-1;i++)
if ((x[i]==x[k])||(abs(x[k]-x[i])==(k-i)))
ev=0;}
void afisare(int x[],int k)
{ nr++;
cout<<endl;
for (i=1;i<=n;i++)
{for (j=1;j<=n;j++)
if (x[i]==j) cout<<x[i];
cout<<"Numar total de solutii="<<nr;}}
int main()
{cout<<"n=";
cin>>n;
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
a[i]=i;
}
k=1;
x[k]=0;
while(k>0) {
do{
succesor(x,k,as);
if(as)
valid(x,k,ev);
}while(as && !ev);
if(as)
if(k==n)
afisare(x,k);
else {
k++;
x[k]=0;
}
else
k--;
}
return 0;}
Răspunsuri la întrebare
Răspuns de
0
Iti trimit sursa mea de 100p la problema Rgine1 de pe pbinfo.Succes!
#include <bits/stdc++.h>
using namespace std;
int n, x[20];
bool gasit;
bool cont(int k)
{
for(int i = 1 ; i < k ; i ++)
{
if(x[i] == x[k]) return false;
if(k - i == abs(x[k] - x[i])) return false;
}
return true;
}
void afisare(int n)
{
gasit = true;
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
if(x[j] == i) cout << "* ";
else cout << "- ";
cout << "\n";
}
}
void back(int k)
{
for(int i = 1 ; !gasit && i <= n ; i ++)
{
x[k] = i;
if(cont(k))
if(k == n) afisare(n);
else back(k + 1);
}
}
int main()
{
cin >> n;
back(1);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int n, x[20];
bool gasit;
bool cont(int k)
{
for(int i = 1 ; i < k ; i ++)
{
if(x[i] == x[k]) return false;
if(k - i == abs(x[k] - x[i])) return false;
}
return true;
}
void afisare(int n)
{
gasit = true;
for(int i = 1 ; i <= n ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
if(x[j] == i) cout << "* ";
else cout << "- ";
cout << "\n";
}
}
void back(int k)
{
for(int i = 1 ; !gasit && i <= n ; i ++)
{
x[k] = i;
if(cont(k))
if(k == n) afisare(n);
else back(k + 1);
}
}
int main()
{
cin >> n;
back(1);
return 0;
}
express:
daca doresti iti trimit si varianta iterativa...dar varianta recursiva e mai scurta
Alte întrebări interesante
Franceza,
8 ani în urmă
Matematică,
8 ani în urmă
Chimie,
8 ani în urmă
Matematică,
9 ani în urmă
Engleza,
9 ani în urmă
Limba română,
9 ani în urmă
Limba română,
9 ani în urmă