Hódító / Queosia forum
Hódító / Queosia forum
http://queosia.com
http://hodito.hu

Go Back   Hódító / Queosia forum > Hódító / Queosia forum > Általános beszélgetések > PC (hardver, szoftver, játékok stb.)
Register Stats Members List Today's Posts

PC (hardver, szoftver, játékok stb.) Minden, ami számítógép. Kedvenc játékod megbeszélése, segítségkérés hardverügyben stb.

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
  #20  
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:
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 23:36.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Design partly based on Hódító's design by Grafinet Team Kft.

Contents and games copyright (c) 1999-2020 - Queosia, Hódító

Partnerek: Játékok, civ.hu