Thread: Programozás
View Single Post
  #148  
Old 11-14-2011, 17:12
Cpt Balu Cpt Balu is offline
Junior Member
 
Join Date: Mar 2011
Posts: 47
Activity: 0%
Longevity: 73%
Default

Quote:
Originally Posted by Kutyuleee View Post
egy forráskódot nekem is küldenél??? elsőre én is hasonló algoritmusban gondolkodtam csak nem volt időm még foglalkozni vele.

Még annyi a kérdés, hogy az eredeti feladatban használható-e rekurzió vagy nem?
Mivel a megoldás maga egyszerűbb, mint a magyarázkodás :P ezért itt postolom az algoritmust C# kódját:
Code:
public static class Searcher
{
	public static int[,] Table;
	static int Width, Height;<-- Tábla méretei
	public static void SetTable(int W, int H)
	{Adott méretű tábla generálása}
	public static void Fill(double p)
	{Feltöltés random szám segítségével, Rand<p?1:0 alapján}
	public static void Search(ref int X, ref int Y, ref int W, ref int H)
	{A kereső függvényünk}
}
Eddig a bevezetés, hogy hogy is néz ki a tábla, tehát int tömb, 1 és 0, ebben fogunk keresgélni.
A következő függvény adja a megoldást, az eredmények
X,Y,W,H változókba kerülnek (híváskor W értéke -1, a többi lényegtelen), amit a hívás helyén tudunk felhasználni:
Code:
public static void Search(ref int X, ref int Y, ref int W, ref int H)
{
	int[,] Dists = new int[Width, Height];
	int[] Stack1 = new int[Width];
	int Stack1P = 0;
	for (int i = Width - 1; i > -1; i--)
	{
		for (int j = Height - 1; j > -1; j--)
			if (Table[i, j] == 1)
				Dists[i, j] = (i == Width - 1 || Table[i + 1, j] == 0) ? 1 : Dists[i + 1, j] + 1;
			else
				Dists[i, j] = 0;
		Stack1[i] = 0;
	}
	for (int i = 0; i < Width; i++)
		if (W == -1 || (Width - i) * Height > W * H)
		{
			int C1 = 0;
			int CF = 0;
			while (C1 <= Height)
			{
				int N = C1 == Height ? 0 : Dists[i, C1];
				if (N == 0)
					CF = C1 + 1;
				while (N != Stack1P)
				{
					if (N > Stack1P)
					{
						Stack1[Stack1P] = C1;
						Stack1P++;
					}
					else if (N < Stack1P)
					{
						Stack1P--;
						int newh = C1 - Stack1[Stack1P];
						int neww = Stack1P + 1;
						if (neww * newh > W * H)
						{
							W = neww;
							H = newh;
							X = i;
							Y = Stack1[Stack1P];
						}
						Stack1[Stack1P] = -1;
						if (Stack1[Stack1P] == CF)
							Stack1P = N;
					}
				}
				C1++;
			}
		}
}
Nem túl hosszú kód, de annál bonyolultabb értelmezni, kíváncsi vagyok ki jön rá mit is csinál pontosan Lehet ötletelgetni!
Segítség: az első for ciklus (for (int i = Width - 1; i > -1; i--)) törzsének végéig az oldalon leírtak szerint működik.
Reply With Quote
The Following User Says Thank You to Cpt Balu For This Useful Post: