Mam następujące zadanie do rozwiązania:
Dana jest kwadratowa plansza o wymiarach N x N, na której znajdują się przeszkody. Po planszy porusza się budowniczy, początkowo znajdujący się na pozycji (i,j). Budowniczy porusza się wg schematu: pierwszy ruch wykonuje w prawo, następne w górę, w lewo i w dół. W każdym kierunku porusza się tak długo, aż napotka przeszkodę albo koniec planszy. Po każdym ruchu zostawia za sobą przeszkodę. Napisz funkcję, która policzy ile przeszkód zostawił budowniczy i wyznaczy jego nową pozycję. Podaj specyfikację wejścia/wyjścia. Dodatkowo narysuj schemat blokowy tej funkcji.
Napisałem do tego program w C++, ale nie działa mi poprawnie, myślę że zrobiłem gdzieś złe warunki w funkcji albo coś podobnego. Zrobiłem całość tej funkcji w pętli nieskończonej, a na końcu jednego przejścia pętli jest sprawdzane, czy da się gdzieś jeszcze przemieszczać na boki czy to już koniec. Może da się całość umieścić w jakiejś konkretniejszej pętli ? W ogóle to program za dużo mi zlicza tych przeszkód, wychodzi ich więcej niż jest pól na planszy. Jedynie jak dam planszę 3 X 3 i miejsce startu (1,1) to działa mi dobrze. Czy ma ktoś jakiś pomysł co z tym zrobić ? Z góry bardzo dziękuję za pomoc :)
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int budowniczy(int n, int **tab, int &i, int &j)
{
int lp=0;
while(true)
{
for(int k=j;k<(n-1);k++)
{
if(tab[i][k+1]==1)
{
if(tab[i][k]!=1)
{
tab[i][k]=1;
lp++;
}
j=k;
break;
}
if(k==(n-2))
{
tab[i][k+1]=1;
if(tab[i][k]!=1) lp++;
j=(k+1);
break;
}
}
for(int w=i;w>0;w--)
{
if(tab[w-1][j]==1)
{
if(tab[w][j]!=1)
{
tab[w][j]==1;
lp++;
}
i=w;
break;
}
if(w==1)
{
tab[w-1][j]=1;
if(tab[w][j]!=1) lp++;
i=(w-1);
break;
}
}
for(int k=j;k>0;k--)
{
if(tab[i][k-1]==1)
{
if(tab[i][k]!=1)
{
tab[i][k]==1;
lp++;
}
j=k;
break;
}
if(k==1)
{
tab[i][k-1]=1;
if(tab[i][k]!=1) lp++;
j=(k-1);
break;
}
}
for(int w=i;w<n-1;w++)
{
if(tab[w+1][j]==1)
{
if(tab[w][j]!=1)
{
tab[w][j]==1;
lp++;
}
i=w;
break;
}
if(w==(n-2))
{
tab[w+1][j]=1;
if(tab[w][j]!=1) lp++;
i=(w+1);
break;
}
}
if(j==(n-1))
{
if(i==0)
{
if(tab[i][j-1]==1) break;
}
else
{
if((tab[i-1][j]==1) && (tab[i][j-1]==1)) break;
}
}
else
{
if(j==0)
{
if(i==0)
{
if(tab[i][j+1]==1) break;
}
else
{
if((tab[i-1][j]==1) && (tab[i][j+1]==1)) break;
}
}
else
{
if((tab[i][j+1]==1) && (tab[i][j-1]==1) && (tab[i-1][j]==1)) break;
}
}
}
return lp;
}
int main()
{
cout << "Podaj rozmiar tablicy:" << endl;
int n;
cin>>n;
int **tab=new int*[n];
for(int i=0;i<n;i++)
{
tab[i]=new int[n];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
tab[i][j]=0;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<tab[i][j];
}
cout<<endl;
}
cout<<"Podaj wspolrzedne i,j:"<<endl;
int i,j;
cin>>i>>j;
int lp=budowniczy(n,tab,i,j);
cout<<lp<<endl;
cout<<i<<" "<<j<<endl;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cout<<tab[i][j];
}
cout<<endl;
}
return 0;
}