/*	plateau.c -- Matthias Jauernig, 09.01.03					*/
/*	Programm liefert einen Algorithmus zur Lösung des "Plateau-Problems"		*/

#include <stdio.h>

/* -- Struktur, um die Länge und den Index eines max. Plateaus abzuspeichern ----------	*/
typedef struct {
	int laenge;
	int index;
} plateau;

/* -- plateau_alg() ---- sucht den Index und die Länge des längsten Plateaus in Array a	*/
plateau plateau_alg(int *a, int n){
	plateau erg={0,-1}; //Rückgabestruktur mit Anfangswerten definieren
	int i, sum;

	//schaue der Reihe nach alle Plateaus an und greife deren Länge ab
	for(i=0; i<n; i+=sum){
		for(sum=1; sum+i<n && a[i]==a[sum+i]; sum++);//Länge (sum) des derzeitigen Plateaus bestimmen
		if(sum>erg.laenge){//neues längstes Plateau gefunden -> Werte speichern
			erg.laenge=sum;
			erg.index=i;
		}
	}
	return erg;
}

/* ---- main() ------------------------------------------------------------------------	*/
int main(void){
	plateau laengstes;
	int a[]={1,2,3,3,4,4,4,5,6,6,6,6,6,7,8,9,9,9,9,9,10};//Beispielarray
	int elem=sizeof(a)/sizeof(a[0]);//Elementeanzahl im Array bestimmen
	int i;

	printf(	"Plateau-Problem\n"
		"---------------\n\n");
	printf("Ausgabe des Arrays:\n");
	printf("  ");
	for(i=0; i<elem; i++)
		printf("%d, ", a[i]);
	printf("\b\b \n\n");

	laengstes=plateau_alg(a, elem);
	printf(	"Laenge des laengsten Plateaus: %d\n", laengstes.laenge);
	printf(	"Index des ersten laengsten Plateaus: %d (Zahl %d)\n\n",
		laengstes.index, a[laengstes.index]);

	return 0;
}

/* Ausgabe mit dem Beispielarray aus main()
Plateau-Problem
---------------

Ausgabe des Arrays:
  1, 2, 3, 3, 4, 4, 4, 5, 6, 6, 6, 6, 6, 7, 8, 9, 9, 9, 9, 9, 10

Laenge des laengsten Plateaus: 5
Index des ersten laengsten Plateaus: 8 (Zahl 6)
*/

