Kaydol:
Kayıt Yorumları
(
Atom
)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace sekiz_vezir
{
class sekiz_vezir
{
static int cozumSayi = 0;
static int[] vezirYerleri;
static int vezirSayisi = 8;
static void Main(string[] args)
{
// vezir yerleri tutmak için int tipinde bir dizi olustur
vezirYerleri = new int[vezirSayisi];
//birinci vezir yerleştirerek işleme başla
vezirYerlestir(0);
//Bütün yerleştirme olasılıkları tamamlandığında ekrana sonucu yaz
Console.WriteLine("\n\n{0} vezir probleminin {1} adet cozumu vardir.\n",
vezirSayisi, cozumSayi);
Console.ReadKey();
}
static void vezirYerlestir(int vezirSira)
{
// vezirlerin birbirini yemediği durum oldugunda cozumu ekrana yaz
// cozum sayısını bir arttır
if (vezirSira == vezirSayisi)
cozumuKonsolEkraninaYaz();
else
//burada sırayla vezirleri yerleştirip birbirini yiyip yemediği kontrolu yap
for (vezirYerleri[vezirSira] = 1; vezirYerleri[vezirSira] < 1 << vezirSayisi;
vezirYerleri[vezirSira] <<= 1)
if (vezirYerleriTamam(vezirSira))
vezirYerlestir(vezirSira + 1);
//bibirini yemediyse bir sonraki veziri yerleştir
}
static bool vezirYerleriTamam(int vezirSira)
{
//burada yeni yerleştirilen vezir ile daha önceki yerleştirilen vezirlerin
//yerlerini kontrol et eğer birbirlerini yemiyorlarsa True döner
//Birbirini yediği ilk durumda False döner
for (int r = 0; r < vezirSira; r++)
if (vezirYerleri[vezirSira] == vezirYerleri[r] ||
vezirYerleri[vezirSira] == vezirYerleri[r] << vezirSira - r
|| vezirYerleri[vezirSira] == vezirYerleri[r] >> vezirSira - r)
{
return false;
}
return true;
}
static void cozumuKonsolEkraninaYaz()
{
int t, r;
Console.WriteLine("\n\n{0}. COZUM \n\n", ++cozumSayi);
for (r = 0; r < vezirSayisi; r++)
{
for (t = 1 << vezirSayisi - 1; t > 0; t >>= 1)
Console.Write("{0}", vezirYerleri[r] == t ? 'V' : '-');
Console.WriteLine();
}
}
}
}
Hiç yorum yok :
Yorum Gönder