Ben şöyle düşündüm: Numaralardan oluşan dizgi klavye üstünde bir şekil çiziyor. Karmaşıklığından bağımsız olarak, bu şeklin serbestisi, yani klavye üzerinde hareket edebilmesi, onu oluşturan numaraların serbestilerinin bileşiminden oluşur. Örneğin, 4'ü içeren hiçbir şekil sola hareket edemez, 6'yı içeren bir şekil sağa hareket edemez, vs.
Sonuçta, hic serbestisi olmayan şekillerden tek vardır.
import std.stdio;
import std.string;
import std.algorithm;
import std.exception;
import std.conv;
struct Serbesti {
int üst; // Yukarıya hareket serbestisi
int sağ; // Sağa hareket serbestisi
int alt; // Aşağıya hareket serbestisi
int sol; // Sola hareket serbestisi
// Bu serbesti ile diğer serbestiyi birleştirir
Serbesti birlikte(Serbesti diğer) const {
return Serbesti(min(this.üst, diğer.üst),
min(this.sağ, diğer.sağ),
min(this.alt, diğer.alt),
min(this.sol, diğer.sol));
}
// Hiç serbestisi yoksa 'false' döndürür
bool hareketEdebilir_mi() const {
return üst || sağ || alt || sol;
}
}
// Numaraların hareket serbestileri
const Serbesti[int] serbestiler;
shared static this() {
serbestiler = [
'0' : Serbesti(3, 0, 0, 0), // 0, yalnızca 3 adım yukarıya hareket edebilir
'1' : Serbesti(0, 2, 2, 0), // 1, sağa ve aşağıya 2 adım hareket edebilir
'2' : Serbesti(0, 1, 3, 1), // vs.
'3' : Serbesti(0, 0, 2, 2),
'4' : Serbesti(1, 2, 1, 0),
'5' : Serbesti(1, 1, 2, 1),
'6' : Serbesti(1, 0, 1, 2),
'7' : Serbesti(2, 2, 0, 0),
'8' : Serbesti(2, 1, 1, 1),
'9' : Serbesti(2, 0, 0, 2),
];
}
void main() {
const adet = stdin.readln.strip.to!size_t;
enforce(adet > 0, "En az bir numara lütfen");
const numaralar = stdin.readln.strip;
enforce(numaralar.length == adet, "Numara adedi tutarsız");
const ortakSerbesti =
numaralar[1..$].fold!((ortak, numara) => ortak.birlikte(serbestiler[numara]))(Serbesti(numaralar[0]));
writeln(ortakSerbesti.hareketEdebilir_mi
? "NO"
: "YES");
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]