Penyelesaian Kasus Diagonal V dengan Array 2 Dimensi (C#)


Terinspirasi dari artikelnya jefrey hermanto tentang solusi kasus diagonal V, iseng2 ja bikin programnya cz cukup simple. Mungkin ada yang belum tau apa itu diagonal V,  tp apa gmna ya njelasinnya. Bingung ndiri, hehehe…Tapi kira-kira bentuknya seperti ini.

Input: 3
3 2 1 2 3
2 3 2 3 2
1 2 3 2 1
2 3 2 3 2
3 2 1 2 3

Nah kira-kira seperti itulah bentuknya, dan solusinya cukup mudah logikanya. Langsung aja saya ambil dari artikelnya jefrey hermanto…hehehe….

KANAN  5 4 3 2 1 2 3 4
BAWAH  4 3 2 1 2 3 4 5
KIRI   4 3 2 1 2 3 4 5
ATAS   5 4 3 2 1 2 3 4 

      ----------->
  5 4 3 2 1 2 3 4 5
  4               4
  3               3
  2               2
  1               1
  2               2
  3               3
  4               4
  5 4 3 2 1 2 3 4 5
     <------------

Berikutnya :
KANAN	5 4 3 2 3 4 5
BAWAH 	4 3 2 3 4 5
KIRI 	4 3 2 3 4 5
ATAS    4 3 2 3 4 5

 5 4 3 2 1 2 3 4 5
 4 5 4 3 2 3 4 5 4
 3 4           4 3
 2 3           3 2
 1 2           2 1
 2 3           3 2
 3 4           4 3
 4 5 4 3 2 3 4 5 4
 5 4 3 2 1 2 3 4 5

Dari solusi tersebut dapat diambil kesimpulan bahwa pada tiap ‘kotak’ pasti terdapat pola yang khusus.  Yaitu terdapat perulangan nilai yang sama ->

5 4 3 2 1 2 3 4 -> pada bagian atas, dari kiri ke kanan
5 4 3 2 1 2 3 4 -> pada bagian kanan, dari atas kebawah
5 4 3 2 1 2 3 4 -> pada bagian bawah, dari kanan ke kiri

5 4 3 2 1 2 3 4 -> pada bagian kiri, dari bawah ke atas.

Jadi intinya cuma mencari nilai pada tiap baris itu kemudian tinggal menyusunya ke empat bagian dan disusun terus menerus sampai kotaknya mengecil.

Koq kebanyakan nggedabrus ya..ckck..dari pada tambah binun, nih saya kasih contoh code nya dalam bahasa C#.

/*
 * Created by SharpDevelop.
 * User: Moch.Lutfi
 * Date: 11/15/2010
 * Time: 11:26 AM
 */
using System;

namespace ArrayDiagonal
{
	class Program
	{
		public static void Main(string[] args)
		{
		     int input;

		    Console.Write("Input: "); // Prompt
		    input = int.Parse(Console.ReadLine());
			show(createArray(input));
			Console.WriteLine();
			Console.ReadKey(true);
		}

		///
		/// Untuk Membuat Array V diagonal
		///
		/// Nilai maksimum dari array diagonal
		/// array diagonal V
		static public int[][] createArray(int input)
		{
			int size = input*2-1;
			int[][] retVal = new int[size][];
			int [] baris;
			int nilai=input;
			int batas=0;
			int posisi;
			for(int I = 0; I < size; I++)
			{
				retVal[I] = new int[size];
			}

			posisi=0;

			for(int J = 0; J < input; J++)
			{
				batas = size-J*2-1;
				baris = getRow(input,batas);
				for(int K=0; K < batas; K++){
					//atas
					retVal[posisi][posisi+K] = baris[K];

                    //kanan
                    retVal[posisi+K][size-1-posisi] = baris[K];

                    //bawah
                    retVal[size-1-posisi][batas - K + posisi] = baris[K];

                    //kiri
					retVal[batas-K+posisi][posisi]=baris[K];
				}
				posisi++;
			}
			retVal[input-1][input-1]=input;
			return retVal;
		}

		///
		/// Menampilkan nilai array 2 dimensi
		///
		/// Array Input 2 dimensi
		static public void show(int [][] A){
			for(int I=0;I
				show(A[I]);
                Console.WriteLine();
			}
		}
		///
		/// Menampilkan nilai array 1 dimensi
		///
		/// Array input 1D
		static public void show(int [] A){
				for(int I=0;I
				Console.Write(A[I]+" ");
				}
		}

		///
		/// Fungsi untuk mencari nilai pada tiap baris
		///
		/// nilai maksimal
		/// panjang karakter
		///
		static public int[] getRow(int max, int len){
			int[] retVal = new int[len];
			int min = (2*max-len)/2;
			int nilai = max;
			bool counter=false;
			for(int I=0;I
				retVal[I]= nilai;
				if(nilai==min)
					counter=true;
				nilai = (counter==false? nilai-1 : nilai + 1);
			}
			return retVal;
		}
	}
}

Outputnya sepertin gambar dibawah ini.

Moga bermanfaat…^_^

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s