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?

Örnek sıralama 2

Örnek sıralama 3

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.

Aynı şekilde eğer E seçilirse I, G, C, A dan biri gelebilir. ayniHarfSatirVeSutundaVarMi() metodun içinde test ediyorum.

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.

Ilk 6 durumın ekran çıktısı

Son çıktı

Çö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

[...] 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: [...]