Informatică, întrebare adresată de One07, 9 ani în urmă

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 express
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;
}


express: daca doresti iti trimit si varianta iterativa...dar varianta recursiva e mai scurta
One07: Multumesc mult
Alte întrebări interesante