Zadanie o zającu

0

Hej. Mam takie zadanie. Zając porusza się jak konik szachowy. Mam wczytać prostokąt o wymiarach nxm, w których będą 0 i 1. Mam wczytaj pozycję wejściową zająca i pozycję do której ma dojść. Zając może chodzić tylko po polach z zerami. Mam wydrukować na końcu czy istnieje droga dojścia do pozycji końcowej czy nie. Napisałem już program, ale system oceniania daje mi 3/6 pkt. Testowałem na przykładowych danych np.
3 4 wymiary prostokąta o takich polach:
0 0 1 0
1 1 0 0
0 1 0 0
0 0 pozycja wejściowa zająca
2 2 pozycja do której ma dojść.

Program jest taki:


#include <iostream>
#include <cstdlib>
using namespace std;

bool szukaj(int n, int m, int **pole, int sX, int sY, int kX, int kY){
bool istnieje=false;
if (pole[sX][sY] == 0){
if (pole[sX][sY] == pole[kX][kY]) {
istnieje = true;
}
else {
pole[sX][sY] = -1;
if (!istnieje && sX < n-1 && sY < m-2) {
istnieje = szukaj(n, m, pole, sX+1, sY+2, kX, kY);
}
if (!istnieje && sX < n-1 && sY > 1) {
istnieje = szukaj(n, m, pole, sX+1, sY-2, kX, kY);
}
if (!istnieje && sX > 0 && sY < m-2) {
istnieje = szukaj(n, m, pole, sX-1, sY+2, kX, kY);
}
if (!istnieje && sX > 0 && sY > 1) {
istnieje = szukaj(n, m, pole, sX-1, sY-2, kX, kY);
}
if (!istnieje && sX < n-2 && sY < m-1) {
istnieje = szukaj(n, m, pole, sX+2, sY+1, kX, kY);
}
if (!istnieje && sX < n-2 && sY > 0) {
istnieje = szukaj(n, m, pole, sX+2, sY-1, kX, kY);
}
if (!istnieje && sX > 1 && sY < m-1) {
istnieje = szukaj(n, m, pole, sX-2, sY+1, kX, kY);
}
if (!istnieje && sX > 1 && sY > 0) {
istnieje = szukaj(n, m, pole, sX-2, sY-1, kX, kY);
}
}
}
return istnieje;
}

int main () {
int n, m;
cout << "Podaj liczbę wierszy n: ";
cin >> n;
cout << "Podaj liczbę kolumn m: ";
cin >> m;
int **pole;

/* Alokowanie potrzebnej pamięci */

pole = (int**)malloc(n*m*sizeof(int*));
for(int i=0; i<n; i++)
	pole[i] = (int*)malloc(m*sizeof(int));

/* Wprowadzanie liczb na pole */

for (int i=0; i<n; i++) {
	for (int j=0; j<m; j++) {
		cin >> pole[i][j];
	}
}

/* Wprowadzanie pozycji początkowej i końcowej zająca */

int startX, startY, koniecX, koniecY;
cout << "Podaj położenie początkowe: ";
cin >> startX >> startY;
cout << "Podaj położenie końcowe: ";	
cin >> koniecX >> koniecY;

/* Sprawdzanie czy zając dojdzie do końca */

bool wartosc = szukaj(n, m, pole, startX, startY, koniecX, koniecY);

if (wartosc==true) {
	cout << "Istnieje droga\n";
}
else {
	cout << "Droga nie istnieje\n";
}

/* Zwalnianie pamieci */

for(int i=0; i<n; i++)
	free(pole[i]);
free(pole);

return 0;

}

0

A to to niby co ma sprawdzać?

if (pole[sX][sY] == 0){
    if (pole[sX][sY] == pole[kX][kY]) {
        istnieje = true;
    }

prawdopodobnie, chciałeś zrobić test na dojście do celu, ale to sprawdza zupełnie jakiś absurd!
To powinien być raczej warunkek:

if (sX==kX && sY==kY) {
    return true;
}
0

Chciałem zrobić test na to co stoi na polu na które wskoczyłem. Jeśli stoi 0 to okej, mogę iść dalej ale jeśli 1 muszę wybrać inny kierunek, bo mogę skakać tylko po zerach.

No tak coś mi się pomyliło w tym drugim if :) Poprawiam.

0

No to gdzie jest warunek na osiągniecie celu?

0

Masz rację poprawiłem. Z pośpiechu skopiowałem z poprzedniego programu i nie mogłem się tego dopatrzeć. Moje zadanie po Twoich poprawkach oceniane jest na 5/6. Jest błąd (WA, wrong answer), ale nie wiem już co może być nie halo :)

0

to powinno wyglądać mniej więcej tak:

bool szukaj(int n, int m, int **pole, int sX, int sY, int kX, int kY){
    // warunek sukcesu
    if (sX==kX && sY==kY) {
        return true;
    }

    // zly ruch
    if (pole[sX][sY]!=0) {
        return false;
    }

    pole[sX][sY] = 1; // optymalizacja - przemysl czemu

    if (sX ???? && sY ?????) {
         if (szukaj( n, m, pole, ???, ???, kX, kY)) {
              return true;
         }
    }
    ....
    return false;
}

sam wypełnij braki

0

Drobna uwaga na przyszłość. W tym kawałku

(!istnieje && sX < n-2 && sY > 0)

Stosuj nawiasy, bo nie wszyscy znają priorytety ! && || < > ...
Poza tym nawet Tobie będzie łatwiej taki kod odczytać.

BTW. Usuń rozwiązanie, żeby nie psuć innym zabawy. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1