Mehmet Ethem SULAN :: Java Recursive Methods :: Javada Recursive Metod Kullanarak 3×3 lük Matariste Satır ve Sütuna Farklı Sayı Gelmek Şartıyla Kaç Farklı Şekilde Sıralanır?

Amaç A,B,C,D,E,F,G,H,I harflerini 3×3 lük matriste aynı satır ve sütuna aynı harf gelmemek şartıyla kaç farklı şekilde sıralarız?
ilk
Örnek sıralama 2
ikinci
Örnek sıralama 3
uc
Yukardaki şekilde farklı sıralamaya çalışıyorum.
Eğer A seçilirse geriye I, H, F,E den biri gelebilir.Bunu test metodumuzda yazıyorum.
rt
Aynı şekilde eğer E seçilirse I, G, C, A dan biri gelebilir. ayniHarfSatirVeSutundaVarMi() metodun içinde test ediyorum.
esec
Eğer F seçilirse A,C,G,I den biri gelebilir. Yani seçilen harfın satır ve sutununu siliyorum geri kalanlardan biri gelirse true dönderir.Ben bu şekilde düşündüm.
ret
Ilk 6 durumın ekran çıktısı
trye
Son çıktı
tryu
Çözüm: 3×3 luk matriste 9 kutucuk var.
1.kutucuk: 9 sayidan biri gelebilir(0,1,2,3,4,5,6,7,8)
2.kutucuk: 8 sayidan biri gelebilir(0.kutucukta biri kullanildi)
3.kutucuk: 7 sayidan biri gelebilir
4.kutucuk: 6 sayidan biri gelebilir
5.kutucuk: 5 sayidan biri gelebilir
6.kutucuk: 4 sayidan biri gelebilir
7.kutucuk: 3 sayidan biri gelebilir
8.kutucuk: 2 sayidan biri gelebilir
9.kutucuk: 1 sayidan biri gelebilir
Yani toplam 9! (9 faktoryel) farkli sekilde siralama yapilabilir.
9!=362880 farklı durum var.

package ethemsulan.com;

import java.util.ArrayList;

public class HarfSiralama {
		static String[] dizim=new String[9];
		static String[] kulHarfler={"A","B","C","D","E","F","G","H","I"};
		static ArrayList<String> oncekiDurumKiyasla=new ArrayList<String>();
	public static void main(String[] args) {
//Baslangic degerlerini null atadik
		for(int i=0;i<9;i++){
			dizim[i]="";
		}
//Recursive metodumuzu cagiriyor
		HarfSiralama.durumlariBul(0);
	}
	static int sayac=0;
	static int ilkAltiDurum=0;
	private static void durumlariBul(int kutu) {
//Durumlar fazla oldugundan ilk alti durumu consolde gormek icin alt satirdaki(if(ilkAltiDurum==6){System.exit(0);}) yorumu kaldirin.
//Kodu calistirinca ilk durum ABCDEFGHİ  ve son durum(yani 362880. durum) İHGFEDCBA oldugunu gorurusunuz.
//		if(ilkAltiDurum==6){System.exit(0);}
		//Durumlari test et eger istenen deger sagliyorsa ekrana yaz. Biz dizideki degerleri
//yazacagimizdan istenen deger dizi boyutudur.yani 9
		if(kutu==9){
			sayac++;
			ilkAltiDurum++;
			int uc=0;
//Her bulunan degeri topla ve(yani her bir siralamayi oncekilerle kiyasla aynisi varsa exit(0) ile islemi durdur)
			String ayniMi="";
			System.out.println(sayac+" . durum");
			for(int i=0;i<9;i++)
			{
				System.out.print(dizim[i]);
				ayniMi+=dizim[i];
				uc++;
				if(uc==3){
					System.out.println("");
					uc=0;
				}
			}
// onceki durumlarla kiyasla eger ayni iki durum varsa System.exit(0) ile islemi durdur.
			if(oncekiDurumKiyasla.contains(ayniMi)){
				System.out.println(ayniMi+" daha onceden varmis");
				System.exit(0);
			}else{
				oncekiDurumKiyasla.add(ayniMi);
			}
			return;
		}
//Asil islem yeri burasidir. Aranan durum test et  ve tum durumlari gozden gecir
		for (String harf : kulHarfler) {
//Eger bu sayi kullanildiysa ayni satir ve sutunda bir daha kullanilmasin diye geciyoruz.Yani bir sonraki duruma bakiyoruz
			if(buHarfDahaOnceKullanildiMi(harf)==false){
				continue;
			}
//Ayni harf satir ve sutuna gelmemesi lazim.Cunku sartimiz ayni harf satir ve sutuna gelmemek sartiyla kac farkli
//sekilde yerlestirme yapabiliriz.Ornek yerlestirme resimde var.Ayni harf yoksa test dogru
			else if(ayniHarfSatirVeSutundaVarMi(dizim[kutu],harf)){
				dizim[kutu]=harf;
				durumlariBul(kutu+1);
				dizim[kutu]="";
			}
		}
	}
//Eger dizi de hic deger yoksa ilk gelen degeri ekle.Eger deger varsa kontrol et. Eger a gelmisse E, F,H, İ den biri ancak gelebilir
	private static boolean ayniHarfSatirVeSutundaVarMi(String varOlanHarf, String gelOlHarf) {
//ABCDEFGHİ VE İHGFEDCBA durumlarini iki farkli durum olarak yazilmasini saglar.Gercekten de iki farkli durumdur.
		if(varOlanHarf.equals("")){
			return true;
		}
		else if(varOlanHarf.equals("A")&& (gelOlHarf.equals("E") | gelOlHarf.equals("F") | gelOlHarf.equals("H") | gelOlHarf.equals("I")))
		{
			return true;
		}
		else if(varOlanHarf.equals("B")&& (gelOlHarf.equals("D") | gelOlHarf.equals("F") | gelOlHarf.equals("G") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("C")&& (gelOlHarf.equals("D") | gelOlHarf.equals("E") | gelOlHarf.equals("G") | gelOlHarf.equals("H")))
		{
		return true;
		}
		else if(varOlanHarf.equals("D")&& (gelOlHarf.equals("B") | gelOlHarf.equals("C") | gelOlHarf.equals("H") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("E")&& (gelOlHarf.equals("A") | gelOlHarf.equals("C") | gelOlHarf.equals("G") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("F")&& (gelOlHarf.equals("A") | gelOlHarf.equals("B") | gelOlHarf.equals("G") | gelOlHarf.equals("H")))
		{
		return true;
		}
		else if(varOlanHarf.equals("G")&& (gelOlHarf.equals("B") | gelOlHarf.equals("C") | gelOlHarf.equals("E") | gelOlHarf.equals("I")))
		{
		return true;
		}
		else if(varOlanHarf.equals("H")&& (gelOlHarf.equals("A") | gelOlHarf.equals("C") | gelOlHarf.equals("D")| gelOlHarf.equals("F")))
		{
		return true;
		}
		else if(varOlanHarf.equals("I")&& (gelOlHarf.equals("A") | gelOlHarf.equals("B") | gelOlHarf.equals("D") | gelOlHarf.equals("E")))
		{
		return true;
		}
		return false;
	}
//Harf dizide varsa false donder. Yeni bir harf ise yani dizide yoksa true donder.
	private static boolean buHarfDahaOnceKullanildiMi(String harf) {
		for(int i=0;i<9;i++){
			if(dizim[i].equals(harf))
				return false;
		}
		return true;
	}

}

Sayılarla yapılmış örneğe bakmak için tıklayın.Ikisinde de aynı mantık var

Comments

There is one comment for this post.

  1. Mehmet Ethem SULAN :: Java Programlama Dili :: How to using Recursive Method in Java(0 den 8 kadar sayıları 3×3 lük matriste kaç farklı şekilde sıralarız) on Eylül 1, 2010 7:35 am

    […] Aynı şekilde çözülmüş başka bir örnek. Resimli olarak gösterilmiş. Şartımız aynı satır ve sütuna aynı sayı gelmeyecek şekilde 0,1,2,3,4,5,6,7,8 sayılarını 3×3 lük matriste kaç farklı şekilde sıralarız? İlk ve son durum çiktilari: […]

Write a Comment

Let me know what you think?