Selam Yeniden,
Bu seferki amaçımız dinamik boyutlu bir satranç tahtasının(3'e 3 de olabilir 5'e 5 de) herhangi bir noktasına bir kale yerleştirdikten sonra kalenin kesmediği hücrelerin sayısını bulmak.
Örneğin 3'e 3 bir tahtada 1. satır ve 1 sütüna bir kale koyduğumuz zaman kalenin kesmediği hüçreler solda giri ile gösterilmiş. Sonra ikinci bir kale 3. satır birinci sütüna koyulunca sadece iki tane kesilmeyen hücre kalmış.
http://codeforces.com/predownloaded/a3/a5/a3a52ec7278de7644c87dc9cb19b4d18eacefebd.png
İlişkili dizileri kullanarak güzel bir algoritma düşünmüştüm ama dildeki yetersizliğim soruyu çözebilmemi engelledi.
Benim bitiremediğim çözümüm :
import std.stdio;
import std.string;
import std.algorithm;
import std.exception;
import std.conv;
import std.array;
import std.range;
bool[int] tahtaİliskiliDizisi;
int tahtaBoyutu = 0;
void satirIleIsaretle( int satir )
{
foreach( i; iota( satir*tahtaBoyutu, (satir+1)*tahtaBoyutu ))
tahtaİliskiliDizisi[i] = true;
//iota( satir*tahtaBoyutu, (satir+1)*tahtaBoyutu ) .map!( a => tahtaİliskiliDizisi[a] = true );
}
void sutunIleIsaretle( int sutun )
{
foreach( i; iota( sutun, tahtaBoyutu*tahtaBoyutu, tahtaBoyutu))
tahtaİliskiliDizisi[i] = true;
//iota( sutun, tahtaBoyutu*tahtaBoyutu, tahtaBoyutu) .map!( a => tahtaİliskiliDizisi[a] = true );
}
void isaretleVeSay( int satir, int sutun )
{
satirIleIsaretle( satir );
sutunIleIsaretle( sutun );
write(tahtaBoyutu*tahtaBoyutu - tahtaİliskiliDizisi.keys.length, " " );
}
void main() {
auto ilkSatir = stdin.readln.strip.split().map!(a => to!int(a)).array();
tahtaBoyutu = ilkSatir[0];
auto kaleSayisi = ilkSatir[1];
int[][] kalePosizyonlari;
//kalePosizyonlari ~= stdin.byLine().take(kaleSayisi-1).to!dstring.strip.split.map!(a => to!int(a)).array();
int sayici = 0;
string line;
while ((line = stdin.readln()) !is null)
{
kalePosizyonlari ~= line.to!dstring.strip.split.map!(a => to!int(a)).array();
if (++sayici >= kaleSayisi)
break;
}
writeln(kalePosizyonlari);
foreach ( posizyon; kalePosizyonlari)
isaretleVeSay( posizyon[0], posizyon[1] );
//kalePosizyonlari.map!( a=> isaretleVeSay(a[0], a[1]) );
}
Burda sizlere sorularım olacak :
1 - kalePosizyonlari ~= stdin.byLine().take(kaleSayisi-1).to!dstring.strip.split.map!(a => to!int(a)).array();
bu çalışmadığı için bir sürü while yok efendim "sayici" değişkeni koşul ifadeleri filan eklemek sorunda kaldım.
acaba ne eksik yapıyorum take yerine until mi kullanmalıydım ?
2- ben map methodunu foreach kullanmağa tercih ediyorum fakat map methodlarım çalışmadı örn:
iota( satir*tahtaBoyutu, (satir+1)*tahtaBoyutu ) .map!( a => tahtaİliskiliDizisi[a] = true ); ne kadar güzel değil mi ?
fakat associative array i yazdırdığım bomboş oluyor sonuç bunlar yerine hep foreach kullanmak zorunda kaldım ve D'nin bütün güzelliği gidiyor gerçekten böle olunca.
3 - Başka tavsiyeniz olurmu acaba?
Sevgiler
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply