Tablice... P-]

0

Witam wszystkich.
Siedze juz 5 godzin przy kompilatorze i mozg powoli odmawia posluszenstwa, wiec kieruje swoje zapytanie na forum :)
Oto moj problem:
Mam tablice dwuwymiarową typu bool (20x20) i potrzebuje sprawdzic, czy pole o polozeniu x,y graniczy z conajmniej jednym polem o wartosci true...

Moj dotychczasowy sposob jest deczko brute force'owy i zapewne posiada kilka niedociagniec, a wyglada on tak:

bool MapStatus[20][20];
//gdzies sobie ta tablice wypelniam...

bool Sprawdz(char x, char y)
{
if(x>0 && x<19 && y>0 && y<19)
			{
				if(MapStatus[x-1][y-1]==true) return true;
				if(MapStatus[x  ][y-1]==true) return true;
				if(MapStatus[x+1][y-1]==true) return true;
				if(MapStatus[x-1][y  ]==true) return true;
				if(MapStatus[x+1][y  ]==true) return true;
				if(MapStatus[x-1][y+1]==true) return true;
				if(MapStatus[x  ][y+1]==true) return true;
				if(MapStatus[x+1][y+1]==true) return true;
			}
			if(x==0 && y==0)
			{
				if(MapStatus[x+1][y  ]==true) return true;
				if(MapStatus[x  ][y+1]==true) return true;
				if(MapStatus[x+1][y+1]==true) return true;
			}
			if(x==19 && y==19)
			{
				if(MapStatus[x-1][y-1]==true) return true;
				if(MapStatus[x  ][y-1]==true) return true;
				if(MapStatus[x-1][y  ]==true) return true;
			}
			if(x==0)
			{
				if(MapStatus[x  ][y-1]==true) return true;
				if(MapStatus[x+1][y-1]==true) return true;
				if(MapStatus[x+1][y  ]==true) return true;
				if(MapStatus[x  ][y+1]==true) return true;
				if(MapStatus[x+1][y+1]==true) return true;
			}
			if(x==19)
			{
				if(MapStatus[x-1][y-1]==true) return true;
				if(MapStatus[x  ][y-1]==true) return true;
				if(MapStatus[x-1][y  ]==true) return true;
				if(MapStatus[x-1][y+1]==true) return true;
				if(MapStatus[x  ][y+1]==true) return true;
			}
			if(y==0)
			{
				if(MapStatus[x-1][y  ]==true) return true;
				if(MapStatus[x+1][y  ]==true) return true;
				if(MapStatus[x-1][y+1]==true) return true;
				if(MapStatus[x  ][y+1]==true) return true;
				if(MapStatus[x+1][y+1]==true) return true;
			}
			if(y==19)
			{
				if(MapStatus[x-1][y-1]==true) return true;
				if(MapStatus[x  ][y-1]==true) return true;
				if(MapStatus[x+1][y-1]==true) return true;
				if(MapStatus[x-1][y  ]==true) return true;
				if(MapStatus[x+1][y  ]==true) return true;
			}
return false;
}

Funkcja mogla by skladac sie jedynie z osmiu instrukcji warunkowych jednak w takim wypadku mogl by wystapic przypadek proby dostepu do nieistniejacych indeksow tablicy (-1,20) dlatego funkcja jest tak zamotana...
Moje pytanie: czy istnieje szybszy i ladniejszy sposob uzyskania oczekiwanego efektu?
(PS. 4 Marooned i podobnych: jesli tak, to jak on wygląda :P)

0

Powinno dzialac:

#include <iostream>

using namespace std;

struct Przesuniecie
{
  signed x, y;
};

const Przesuniecie przesuniecie[8] = { {-1, -1}, {0, -1}, {1, -1},
                                       {-1, 0}, {1, 0},
                                       {-1, 1}, {0, 1}, {1, 1} };

bool MapStatus[20][20] = {true};

bool daj_wartosc(int x, int y)
{
  if ( x < 0 || x > 19 || y < 0 || y > 19 )
   return false;
  return MapStatus[x][y];
}

bool Sprawdz(int x, int y)
{
  for (int i = 0; i < 8; i++)
   if ( daj_wartosc(x + przesuniecie[i].x, y + przesuniecie[i].y) )
    return true;
  return false;
}

int main()
{
  cout << Sprawdz(1, 1);
  cin.get();
  return 0;
}
0
bool ms[22][22];

// ms[0][x] == ms[21][x] == ms[x][0] == ms[x][21] == false

bool Sprawdz(char x,char y) {
  if (x<0 || x>19 || y<0 || y>19 )
    return false;
  else
    return (ms[x][y] | ms[x][y+1] | ms[x][y+2] | ms[x+1][y+2] | ms[x+2][y+2] | ms[x+2][y+1] | ms[x+2][y] | ms[x+1][y]);
}

w każdym razie coś takiego... dawno nie pisałem nic w C, mogłem jakiegoś babola zrobić

0

Wielkie dzięki Wam obu (obojgu?).
Ciekawe rozwiązania :) zaraz przetestuje...

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