Nie byłem pewien czy dla tablicy struktur też tak będzie. Znalazłem kilka błędów i teraz się nie kończy.
Wrzucam wszystko co napisałem oraz polecenie, byłbym wdzięczny za pomoc. W treści jest że nie skończona, nie umiem jeszcze list dlatego zrobiłem na skończonej.
#include <iostream>
#include <string>
#include <cstdlib>
#include <conio.h>
using namespace std;
struct pole
{
int pole;
int lpionkow;
};
const int N=20;
int czymoze(pole pionki[],int i);
bool czykoniec(pole pionki[]);
void skokwprawo(pole pionki[],int i);
void skokwlewo(pole pionki[],int i);
int main()
{
int i,n;
string czydalej;
pole pionki[N];
for(int j=0,k=-N/2;j<N;j++,k++)
{
pionki[j].pole=k;
pionki[j].lpionkow=0;
}
do//wprowadzanie danych dp tablicy struktu
{
cout<<"\nwprowadz numer pola: ";
cin>>i;
cout<<"\nwprowadz ilosc pionkow na polu: ";
cin>>n;
pionki[i+N/2].lpionkow=n;
system("cls");
cout<<"\nczy chcesz kontynuowac(Y/N)";
cin>>czydalej;
system("cls");
if(czydalej=="N"||czydalej=="n")
break;
}while(1);
while(1)//petla krecaca sie caly czas, przerywana jest breakiem
{
if(czykoniec(pionki))//funkcja ktora sprawdza czy dana konfiguracja jest prawidlowa, jezeli jest to przerywa petle
break;
for(int i=N-1;i>=0;i--)//petla przechodzaca po calej tablicy struktur od "prawej" strony
{
if(czymoze(pionki,i)==1)//jezeli funkcja czy moze zwroci 1, tzn mozliwy jest skok w prawo to go wykonuje i konczy petle
{
skokwprawo(pionki,i);
break;
}
else if(czymoze(pionki,i)==2)//jezeli funkcja czy moze zwroci 2, tzn jezeli skok w prawo jest niemozliwy to ykonuje w lewo jak jest mozliwy
{
skokwlewo(pionki,i);
break;
}
}
}
for(int j=0;j<N;j++)//petla wypisujaca konfiguracje
cout<<pionki[j].pole<< " " << pionki[j].lpionkow<<endl;
return 0;
}
bool czykoniec(pole pionki[])//funkcja sprawdzajaca czy dana konfiguracja jest juz prawidlowa
{
bool ok=false;
for(int i=0;i<N;i++)//petla poruszajca sie po calej tablicy
{
if((pionki[i].lpionkow+pionki[i-1].lpionkow)<2)//jezeli warunki sa spelnione to jak sie petla skonczy i ciagle bedzie true to koniec
ok=true;
else if(pionki[i].lpionkow>1)//jezeli na jakims polu liczba pionkow jest wieksza od 1 to od razu konczy petle i funkcje zwracajac false
{
ok=false;
break;
}
}
return ok;
}
void skokwprawo(pole pionki[],int i)//funkcja wykonująca skok w prawo
{
pionki[i+1].lpionkow+=1;
pionki[i].lpionkow-=1;
pionki[i-1].lpionkow-=1;
}
void skokwlewo(pole pionki[],int i)//fukncja wykonujaca skok w lewo
{
pionki[i].lpionkow-=1;
pionki[i-1].lpionkow+=1;
pionki[i-2].lpionkow+=1;
}
int czymoze(pole pionki[],int i)//funkcja okreslajaca ktory skok nalezy wykonac
{
if(i<N-1&&i>0)//sprawdzanie warunku skoku w prawo
{
if(pionki[i].lpionkow!=0&&pionki[i-1].lpionkow!=0&&(pionki[i].lpionkow<pionki[i-1].lpionkow))
{
return 1;
}
}
else if(i>0)//sprawdzanie warunku skoku w lewo
{
if(pionki[i].lpionkow>1&&pionki[i].lpionkow>pionki[i-1].lpionkow)
{
return 2;
}
}
else//jezeli zadne to nie wykoana skoku dla danego pola
return 0;
}