http___projecteulercozum.blogspot.com.tr_2014_02_problem-96-su-doku.html_1.xml
1.1 3.1 4.1 5.1 6.1 7.1 8.1 10.1 11.1 12.1 13.1 14.1 16.1 16.2 16.3 17.1 19.1 20.1 21.1 21.2 22.1 23.1 24.1 25.1 26.1 27.1 28.1 29.1 31.1 32.1 34.1 36.1 37.1 40.1 41.1 43.1 46.1 48.1 51.1
public boolean boolElementExists(String strObjType, String strText) boolean boolret = false; //Suppose there are multiple object text provided of an object type provided in the strText, we will provide text separated by > . //for e.g : login>HELP as link object in the Page String[] sre = strText.split(">"); // Loop through each of the text provided for ( int j = 0;j<sre.length;j++) List  elemlst = null; // We will convert the strObjType to Upper Case and trimming the text around. strObjType = strObjType.toUpperCase().trim(); //we will use try catch to return false mostly to handle scenario of object not found expection , in this case we will return false from the function try //we will use a switch to perform action on an object. A case is used in this case to store different value in WebElement List Object. Using switch provides good option to create generic functions switch (strObjType) // in case of link object storing all the elements of type link in elemlst case "LINK": // driver is already discussed in a previous article . Please refer to below article to understand how a driver object is created. Understanding Selenium Web Driver: Launching Selenium on different browsers elemlst = driver.findElements(By.tagName("a")); break; // in case of link object storing all the elements of type link in label case "LABEL": elemlst = driver.findElements(By.tagName("label")); break; // This is just a example , we can define other objects type also // Now we will loop through all the objects of link , and whereever the text matches , we will loop out of the function and true will be returned. for (int i=0;i<elemlst.size();i++) if (elemlst.get(i).getText().contentEquals(strText.trim())) boolret = true; i= elemlst.size()-1; // In case no match is found , it will return false. if (boolret = false) return false; catch(Exception e) return false; return boolret;
1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1 11.1 12.1 13.1 14.1 15.1 16.1 17.1 18.1 19.1 20.1 21.1 23.1 24.1 26.1 27.1 28.1 29.1 30.1 31.1 33.1 34.1 35.1 37.1 38.1 39.1 40.1 41.1 43.1 44.1 45.1 47.1 48.1 49.1 50.1 51.1 52.1 53.1 55.1 56.1 57.1 58.1 59.1 60.1 61.1 62.1 63.1
30 Ocak 2014 Perşembe Problem 96 - Su Doku Soru Japonca anlamı sayı yerleştirme olan Sudoku problemiyle karşı karşıyayız. Her bir satırı ve sütunu 1-9 arası sayıların tamamını birer kere içeren, 9x9'luk karelerden oluşuyor. Aynı zamanda 9 parçaya ayrılmış 3x3'lük kareleri de 1-9'a kadar olan sayıların hepsini barındırmalı. Soruda istenilen, .txt dosyası ile verilen 50 adet Sudoku'nun çözülmesi ve her Sudoku'nun ilk üç karesinin toplamlarının bulunması. Bu sayı örnekte 483. http://projecteuler.net/problem=96 http://projecteuler.net/project/sudoku.txt Çözüm Elbette her Sudoku'yu tek tek çözmeyeceğiz. Bunun için Sudoku çözen bir program yapmamız lazım. Bunun için öncelikle kuralları iyi belirlemeliyiz. 1) Her satırda 1-9 arası tüm sayılar bulunmalı 2) Her sütunda 1-9 arası tüm sayılar bulunmalı 3) Her üçlüde 1-9 arası tüm sayılar bulunmalı Çeşitli yollarla çözmek mümkün. Ben iki boyutlu tek bir bool dizi kullanarak çözme yolunu tercih ettim. Her bir sayı için matriste dolaşıp o sayıyı bulunduğunda, mevcut olduğu satır ve sütunları eleyen bir dizi. Çünkü her sayı bir satır, sütun ve üçlüde yalnızca bir kere bulunabilir. Öyleyse sayının bulunduğu satır, sütun ve üçlüleri elersek geriye kalan kareler bize sayının olası konumlarını verir. Bunu muhakkak bir kağıda çizerek denemelisiniz, zaten bu elemeleri yaptığınızda sistemin nasıl işlediği kolayca belli oluyor. Bundan sonra o satır, sütun ve üçlülerin özel olup olmadığını test edeceğiz. Buradan özelden kastım, o sayı mecburen orada mı olmalıdır, yani başka koyulacak bir yer yok mudur sorusunun cevabıdır. Fakat tüm bunlar yine yetersiz kalabilir ve başka bir yola başvurmak zorunda kalabiliriz. O durumda da mevcut olasılıkları deneyerek sonucun doğru çıktığı yolu bulmaya çalışacağız. Bu işin zor kısmı, ne de olsa zor sudokular için. Kodlama İlk başta basit kısmı ele alalım. Programın tüm işini yürüten parça bu kod. İşaretleme kısmı static void CheckingProcess(char Number) for (int a = 0; a < 9; a++) // Checking all true(possible) for (int b = 0; b < 9; b++) PossibleSquares[a, b] = true; for (int i = 0; i < 9; i++) for (int j = 0; j < 9; j++) if (Board[i, j] == Number) EliminateSquares(i, j); ListingProcess(Number); Üstteki kodun ilk iki for döngüsü tüm kareleri true değerle işaretliyor. Sonrasındaki iki for döngüsü ise, EliminateSquares(KareleriEle) metotunu kullanarak belirlenen bir sayının matristeki i ve j konumunu göndererek o konumdaki üçlüyü, satır ve sütunu false olarak işaretliyor. Son olarak da ListingProcess(Listelemeİşlemi) yeni listeyi oluşturuyor. Eleme İşlemi static void EliminateSquares(int i, int j) for (int a = 0; a < 9; a++) // Eliminate row PossibleSquares[i, a] = false; for (int a = 0; a < 9; a++) // Eliminate column PossibleSquares[a, j] = false; EliminateTriad(i, j); Burada EliminateTriad(ÜçlüyüEle) fonksiyonunu ayrıca yazıp çağırdım. İlk for döngüsü satırı ikincisi ise sütunu karalıyor(false yapıyor). Satır Özel mi? static bool isRowUnique(int i, int j) byte count = 0; for (int a = 0; a < 9; a++) if (PossibleSquares[i, a] == true) count++; if (count > 1) return false; return true; Yukarıdaki kod ise, o satırda eğer sadece bir kareye bu sayı yerleştirilebiliyorsa true, eğer başka kareye de gelme olasılığı varsa false değerini döndürüyor. Eğer true dönerse, o sayı mecbur o kareye gelecektir ve biz de onu tahmine gerek kalmaksızın oraya koyabiliriz. Sayıyı kareye yerleştirme if (PossibleSquares[i, j] == true && (isRowUnique(i,j) || isColumnUnique(i,j) || isTriadUnique(i,j) )) Board[i, j] = Number; Üstteki kodda dikkat edilmesi gereken paranteze alınmış "veya" - "||" işlemleri. Sayının muhtemelen o kareye gelme ihtimalinin doğru olması ve o üç kuraldan sadece birinin geçerli olması oraya yerleştirmemiz için yeterli koşulu sağlıyor. Bu haliyle işleme aldığınızda 50 Sudoku'dan alınan sonuç aşağıdaki gibi oluyor. Dolayısıyla zor Sudoku'ları çözmek için tahmin yoluna da gideceğiz. Bunu da sonra ekleyeceğim. Gönderen Ögetay Kayalı zaman: 06:41 Etiketler: C#, Çözüm, Project Euler 96 Çözüm, Sudoku, Sudoku Çözücü Kaydol: Kayıt Yorumları (Atom)