Derleme zamanında sekiz kraliçe problemini çöz [kapalı]


39

Derleme zamanında sekiz kraliçe bulmacasını çözebilir misin ?

Uygun çıktı formatlarını seçin.

Özellikle bir C ++ şablon metaprogramlama çözümüyle ilgileniyorum, ancak Haskell'in tür sistemi gibi benzer yapıları olan dilleri kullanabilirsiniz.

İdeal olarak metaprogramınız tüm çözümleri çıkarır. Kodlama yok.


Neden farklı dillere izin vermiyorsun?
kullanıcı bilinmeyen

@ user: C ++ TMP çözümüyle ilgileniyorum çünkü. Çok benzer yapıları olan bir dil biliyorsanız, cevap yazmaktan çekinmeyin.
R. Martinho Fernandes,

Haskell tip sistemini de kullanabilir miyim? AFAIK tamamlandı olmalıdır.
FUZxxl

@ FUZxxl: Evet. Soruyu düzenleyeceğim.
R. Martinho Fernandes,

Kaba kuvvet çözümü yapmak yeterli mi?
counterclockwis

Yanıtlar:


50

Meta programım 92 çözümü de bulur. Hata mesajları olarak basılıyorlar:

error: 'solution' is not a member of 'print<15863724>'

Bu, birinci kraliçenin y = 1'e, ikincisi y = 5'e, üçüncüsü y = 8'e vb. Yerleştirilmelidir.

İlk olarak, bazı yararlı meta-fonksiyonlar:

template <typename T>
struct return_
{
    typedef T type;
};

template <bool Condition, typename Then, typename Else>
struct if_then_else;

template <typename Then, typename Else>
struct if_then_else<true, Then, Else> : return_<Then> {};

template <typename Then, typename Else>
struct if_then_else<false, Then, Else> : return_<Else> {};

template <int N>
struct constant
{
    enum { value = N };
};

template <int N>
struct print
{
    // empty body -> member access yields a compiler error involving N
};

Sonra, iki ilginç meta-fonksiyon (tekil ve çoğul olduğuna dikkat edin):

template <int queens, int rows, int sums, int difs, int x, int y>
struct put_queen;

template <int queens, int rows, int sums, int difs, int x>
struct put_queens : constant
     < put_queen<queens, rows, sums, difs, x, 1>::value
     + put_queen<queens, rows, sums, difs, x, 2>::value
     + put_queen<queens, rows, sums, difs, x, 3>::value
     + put_queen<queens, rows, sums, difs, x, 4>::value
     + put_queen<queens, rows, sums, difs, x, 5>::value
     + put_queen<queens, rows, sums, difs, x, 6>::value
     + put_queen<queens, rows, sums, difs, x, 7>::value
     + put_queen<queens, rows, sums, difs, x, 8>::value > {};

template <int queens, int rows, int sums, int difs, int x, int y>
struct put_queen : if_then_else<
    rows & (1 << y) || sums & (1 << (x + y)) || difs & (1 << (8 + x - y)),
    constant<0>,
    put_queens<queens * 10 + y, rows | (1 << y), sums | (1 << (x + y)),
               difs | (1 << (8 + x - y)), x + 1>
>::type {};

Değişken queens, tahtaya yerleştirilen kraliçelerin y koordinatlarını saklar. Aşağıdaki üç değişken, kraliçeler tarafından zaten işgal edilmiş olan satırları ve çaprazları saklar. xve ykendini açıklayıcı olmalıdır.

İlk argüman if_then_elsemevcut pozisyonun engellenip engellenmediğini kontrol eder. Eğer öyleyse, özyineleme (anlamsız) sonucu 0 döndürerek durur. Aksi takdirde, kraliçe tahtaya yerleştirilir ve işlem bir sonraki sütunla devam eder.

X 8'e ulaştığında, bir çözüm bulduk:

template <int queens, int rows, int sums, int difs>
struct put_queens<queens, rows, sums, difs, 8>
{
    enum { value = print<queens>::solution };
};

Yana printşablon hiçbir üyesi var solution, derleyici bir hata oluşturur.

Ve son olarak, süreci başlatmak valueiçin boş tahta üyesini inceliyoruz:

int go = put_queens<0, 0, 0, 0, 0>::value;

Programın tamamı ideone'de bulunabilir .


2
Ben seviyorum: 1) veri depolamak için bitfields kullanarak, 2) çıkış yöntemi seçimi.
R. Martinho Fernandes,

7
Tek bir cevap için çok fazla uygunsuzluk.
st0le

Ayrıca x değerlerini de çıkarmamalı mı?
DeadMG

2
@DeadMG Her kraliçe konumunun x değeri, dizedeki konumudır (1-8).
Briguy37

22

Haskell tip sistemini kullanan bir çözüm buldum. Var olan bir çözüm için değer seviyesindeki soruna biraz göz attım, biraz değiştirdim ve sonra da tür düzeyine yükselttim. Çok fazla yeniden icat aldı. Ayrıca bir sürü GHC uzatması sağlamak zorunda kaldım.

Birincisi, tamsayılar tür düzeyinde izin verilmediğinden, doğal sayıları bir kez daha yeniden icat etmem gerekiyordu, bu kez türler:

data Zero -- type that represents zero
data S n  -- type constructor that constructs the successor of another natural number
-- Some numbers shortcuts
type One = S Zero
type Two = S One
type Three = S Two
type Four = S Three
type Five = S Four
type Six = S Five
type Seven = S Six
type Eight = S Seven

Uyarladığım algoritma, doğalları toplamalar ve çıkarmalar yapıyor, bu yüzden bunları da yeniden icat etmek zorunda kaldım. Tip seviyesindeki fonksiyonlar, resort tipine ve tip sınıflarına göre tanımlanır. Bu, çoklu parametre tipi sınıfları ve işlevsel bağımlılıklar için uzantıları gerektirir. Tip sınıfları "değerleri döndüremez", bu yüzden PROLOG'a benzer şekilde bunun için fazladan bir parametre kullanırız.

class Add a b r | a b -> r -- last param is the result
instance Add Zero b b                     -- 0 + b = b
instance (Add a b r) => Add (S a) b (S r) -- S(a) + b = S(a + b)

class Sub a b r | a b -> r
instance Sub a Zero a                     -- a - 0 = a
instance (Sub a b r) => Sub (S a) (S b) r -- S(a) - S(b) = a - b

Özyineleme, sınıf iddialarıyla uygulanır, böylece sözdizimi biraz geriye bakar.

Sırada booleanlar vardı:

data True  -- type that represents truth
data False -- type that represents falsehood

Ve eşitsizlik karşılaştırması yapacak bir fonksiyon:

class NotEq a b r | a b -> r
instance NotEq Zero Zero False                -- 0 /= 0 = False
instance NotEq (S a) Zero True                -- S(a) /= 0 = True
instance NotEq Zero (S a) True                -- 0 /= S(a) = True
instance (NotEq a b r) => NotEq (S a) (S b) r -- S(a) /= S(b) = a /= b

Ve listeler ...

data Nil
data h ::: t
infixr 0 :::

class Append xs ys r | xs ys -> r
instance Append Nil ys ys                                       -- [] ++ _ = []
instance (Append xs ys rec) => Append (x ::: xs) ys (x ::: rec) -- (x:xs) ++ ys = x:(xs ++ ys)

class Concat xs r | xs -> r
instance Concat Nil Nil                                         -- concat [] = []
instance (Concat xs rec, Append x rec r) => Concat (x ::: xs) r -- concat (x:xs) = x ++ concat xs

class And l r | l -> r
instance And Nil True                    -- and [] = True
instance And (False ::: t) False         -- and (False:_) = False
instance (And t r) => And (True ::: t) r -- and (True:t) = and t

ifAyrıca tür düzeyinde eksik ...

class Cond c t e r | c t e -> r
instance Cond True t e t  -- cond True t _ = t
instance Cond False t e e -- cond False _ e = e

Ve bununla birlikte, kullandığım tüm destekleyici makineler yerindeydi. Sorunun kendisiyle mücadele zamanı!

Mevcut bir panoya bir kraliçe ekleyip tamamlamadığınızı test etmek için bir işlevle başlamak:

-- Testing if it's safe to add a queen
class Safe x b n r | x b n -> r
instance Safe x Nil n True    -- safe x [] n = True
instance (Safe x y (S n) rec,
          Add c n cpn, Sub c n cmn,
          NotEq x c c1, NotEq x cpn c2, NotEq x cmn c3,
          And (c1 ::: c2 ::: c3 ::: rec ::: Nil) r) => Safe x (c ::: y) n r
    -- safe x (c:y) n = and [ x /= c , x /= c + n , x /= c - n , safe x y (n+1)]

Ara sonuçların elde edilmesi için sınıf iddialarının kullanıldığına dikkat edin. Dönüş değerleri aslında fazladan bir parametre olduğundan, iddiaları doğrudan birbirimizden arayamayız. Yine, eğer PROLOG'u daha önce kullandıysanız, bu tarzı biraz tanıdık bulabilirsiniz.

Lambda ihtiyacını ortadan kaldırmak için birkaç değişiklik yaptıktan sonra (uygulayabildiğim, ancak başka bir gün için ayrılmaya karar verdim), özgün çözüm şöyle görünüyordu:

queens 0 = [[]]
-- The original used the list monad. I "unrolled" bind into concat & map.
queens n = concat $ map f $ queens (n-1)
g y x = if safe x y 1 then [x:y] else []
f y = concat $ map (g y) [1..8]

mapdaha yüksek dereceli bir fonksiyondur. Daha yüksek dereceli meta-fonksiyonlar uygulamanın çok fazla güçlük olacağını düşündüm (yine lambdalar), bu yüzden daha basit bir çözüm buldum: hangi fonksiyonların haritalanacağını bildiğim mapiçin, her biri için özel versiyonlar uygulayabiliyorum , ki bunlar üst düzey fonksiyonlar.

-- Auxiliary meta-functions
class G y x r | y x -> r
instance (Safe x y One s, Cond s ((x ::: y) ::: Nil) Nil r) => G y x r

class MapG y l r | y l -> r
instance MapG y Nil Nil
instance (MapG y xs rec, G y x g) => MapG y (x ::: xs) (g ::: rec)

-- Shortcut for [1..8]
type OneToEight = One ::: Two ::: Three ::: Four ::: Five ::: Six ::: Seven ::: Eight ::: Nil

class F y r | y -> r
instance (MapG y OneToEight m, Concat m r) => F y r -- f y = concat $ map (g y) [1..8]

class MapF l r | l -> r
instance MapF Nil Nil
instance (MapF xs rec, F x f) => MapF (x ::: xs) (f ::: rec)

Ve son meta-fonksiyon şimdi yazılabilir:

class Queens n r | n -> r
instance Queens Zero (Nil ::: Nil)
instance (Queens n rec, MapF rec m, Concat m r) => Queens (S n) r

Geriye kalan tek şey, çözümleri kontrol etmek için tip kontrol makinelerini koaksiyel bir tür sürücü.

-- dummy value of type Eight
eight = undefined :: Eight
-- dummy function that asserts the Queens class
queens :: Queens n r => n -> r
queens = const undefined

Bu meta-programın tip denetleyicisi üzerinde çalışması gerekiyordu, böylece biri ateşlenip aşağıdakileri ghciisteyebilir queens eight:

> :t queens eight

Bu, varsayılan yineleme sınırını oldukça hızlı aşacaktır (yaklaşık olarak 20). Bu sınırı artırmak için, çağırmak için gereken ghciile -fcontext-stack=Nseçenek, Nistenen yığın derinliği (N = 1000 ve on beş dakika yeterli değildir). Bu koşuyu henüz tamamlanmamıştı, çünkü çok uzun zaman alıyor, ama koşmayı başardım queens four.

Orada tam bir programdır oldukça sonuç türlerini yazdırmak için bazı makinelerle ideone üzerinde, ama orada sadece queens twosınırlarını aşmadan çalıştırabilirsiniz :(


İlginç bir çözümün yanı sıra, bu sınıf / örnek mantığı ile yapılabilecekler için eğlenceli bir referanstır
Michael Klein,

11

C, önişlemci aracılığıyla

Bence ANSI komitesi C önişlemcisini Turing-tamamlanma noktasına kadar uzatmamak için bilinçli bir seçim yaptı. Her durumda, sekiz kraliçe problemini çözebilecek kadar güçlü değil. Genel anlamda değil.

Ancak, döngü sayaçlarını zor kodlamaya istekliysen, yapılabilir. Elbette döngü oluşturmanın gerçek bir yolu yoktur, ancak #include __FILE__sınırlı bir özyineleme elde etmek için kendi kendine dahil etme özelliğini kullanabilirsiniz .

#ifdef i
# if (r_(i) & 1 << j_(i)) == 0 && (p_(i) & 1 << i + j_(i)) == 0 \
                               && (n_(i) & 1 << 7 + i - j_(i)) == 0
#  if i == 0
#   undef i
#   define i 1
#   undef r1
#   undef p1
#   undef n1
#   define r1 (r0 | (1 << j0))
#   define p1 (p0 | (1 << j0))
#   define n1 (n0 | (1 << 7 - j0))
#   undef j1
#   define j1 0
#   include __FILE__
#   undef j1
#   define j1 1
#   include __FILE__
#   undef j1
#   define j1 2
#   include __FILE__
#   undef j1
#   define j1 3
#   include __FILE__
#   undef j1
#   define j1 4
#   include __FILE__
#   undef j1
#   define j1 5
#   include __FILE__
#   undef j1
#   define j1 6
#   include __FILE__
#   undef j1
#   define j1 7
#   include __FILE__
#   undef i
#   define i 0
#  elif i == 1
#   undef i
#   define i 2
#   undef r2
#   undef p2
#   undef n2
#   define r2 (r1 | (1 << j1))
#   define p2 (p1 | (1 << 1 + j1))
#   define n2 (n1 | (1 << 8 - j1))
#   undef j2
#   define j2 0
#   include __FILE__
#   undef j2
#   define j2 1
#   include __FILE__
#   undef j2
#   define j2 2
#   include __FILE__
#   undef j2
#   define j2 3
#   include __FILE__
#   undef j2
#   define j2 4
#   include __FILE__
#   undef j2
#   define j2 5
#   include __FILE__
#   undef j2
#   define j2 6
#   include __FILE__
#   undef j2
#   define j2 7
#   include __FILE__
#   undef i
#   define i 1
#  elif i == 2
#   undef i
#   define i 3
#   undef r3
#   undef p3
#   undef n3
#   define r3 (r2 | (1 << j2))
#   define p3 (p2 | (1 << 2 + j2))
#   define n3 (n2 | (1 << 9 - j2))
#   undef j3
#   define j3 0
#   include __FILE__
#   undef j3
#   define j3 1
#   include __FILE__
#   undef j3
#   define j3 2
#   include __FILE__
#   undef j3
#   define j3 3
#   include __FILE__
#   undef j3
#   define j3 4
#   include __FILE__
#   undef j3
#   define j3 5
#   include __FILE__
#   undef j3
#   define j3 6
#   include __FILE__
#   undef j3
#   define j3 7
#   include __FILE__
#   undef i
#   define i 2
#  elif i == 3
#   undef i
#   define i 4
#   undef r4
#   undef p4
#   undef n4
#   define r4 (r3 | (1 << j3))
#   define p4 (p3 | (1 << 3 + j3))
#   define n4 (n3 | (1 << 10 - j3))
#   undef j4
#   define j4 0
#   include __FILE__
#   undef j4
#   define j4 1
#   include __FILE__
#   undef j4
#   define j4 2
#   include __FILE__
#   undef j4
#   define j4 3
#   include __FILE__
#   undef j4
#   define j4 4
#   include __FILE__
#   undef j4
#   define j4 5
#   include __FILE__
#   undef j4
#   define j4 6
#   include __FILE__
#   undef j4
#   define j4 7
#   include __FILE__
#   undef i
#   define i 3
#  elif i == 4
#   undef i
#   define i 5
#   undef r5
#   undef p5
#   undef n5
#   define r5 (r4 | (1 << j4))
#   define p5 (p4 | (1 << 4 + j4))
#   define n5 (n4 | (1 << 11 - j4))
#   undef j5
#   define j5 0
#   include __FILE__
#   undef j5
#   define j5 1
#   include __FILE__
#   undef j5
#   define j5 2
#   include __FILE__
#   undef j5
#   define j5 3
#   include __FILE__
#   undef j5
#   define j5 4
#   include __FILE__
#   undef j5
#   define j5 5
#   include __FILE__
#   undef j5
#   define j5 6
#   include __FILE__
#   undef j5
#   define j5 7
#   include __FILE__
#   undef i
#   define i 4
#  elif i == 5
#   undef i
#   define i 6
#   undef r6
#   undef p6
#   undef n6
#   define r6 (r5 | (1 << j5))
#   define p6 (p5 | (1 << 5 + j5))
#   define n6 (n5 | (1 << 12 - j5))
#   undef j6
#   define j6 0
#   include __FILE__
#   undef j6
#   define j6 1
#   include __FILE__
#   undef j6
#   define j6 2
#   include __FILE__
#   undef j6
#   define j6 3
#   include __FILE__
#   undef j6
#   define j6 4
#   include __FILE__
#   undef j6
#   define j6 5
#   include __FILE__
#   undef j6
#   define j6 6
#   include __FILE__
#   undef j6
#   define j6 7
#   include __FILE__
#   undef i
#   define i 5
#  elif i == 6
#   undef i
#   define i 7
#   undef r7
#   undef p7
#   undef n7
#   define r7 (r6 | (1 << j6))
#   define p7 (p6 | (1 << 6 + j6))
#   define n7 (n6 | (1 << 13 - j6))
#   undef j7
#   define j7 0
#   include __FILE__
#   undef j7
#   define j7 1
#   include __FILE__
#   undef j7
#   define j7 2
#   include __FILE__
#   undef j7
#   define j7 3
#   include __FILE__
#   undef j7
#   define j7 4
#   include __FILE__
#   undef j7
#   define j7 5
#   include __FILE__
#   undef j7
#   define j7 6
#   include __FILE__
#   undef j7
#   define j7 7
#   include __FILE__
#   undef i
#   define i 6
#  elif i == 7
    printf("(1 %d) (2 %d) (3 %d) (4 %d) (5 %d) (6 %d) (7 %d) (8 %d)\n",
           j0 + 1, j1 + 1, j2 + 1, j3 + 1, j4 + 1, j5 + 1, j6 + 1, j7 + 1);
#  endif
# endif
#else
#include <stdio.h>
#define _cat(a, b) a ## b
#define j_(i) _cat(j, i)
#define n_(i) _cat(n, i)
#define p_(i) _cat(p, i)
#define r_(i) _cat(r, i)
int main(void)
{
# define i 0
# define j0 0
# include __FILE__
# undef j0
# define j0 1
# include __FILE__
# undef j0
# define j0 2
# include __FILE__
# undef j0
# define j0 3
# include __FILE__
# undef j0
# define j0 4
# include __FILE__
# undef j0
# define j0 5
# include __FILE__
# undef j0
# define j0 6
# include __FILE__
# undef j0
# define j0 7
# include __FILE__
# undef j0
    return 0;
}
#endif

Korkunç miktarda tekrarlayan içeriğe rağmen, sekiz kraliçe problemini algoritmik olarak çözdüğüne dair sizi temin ederim. Maalesef, önişlemciyle yapamadığım tek şey, genel bir aşağı açılır yığın veri yapısını uygulamaktır. Sonuç olarak i, ayarlamak için başka bir değer seçmek için kullanıldığı yerde değerini kodlamak zorunda kaldım . (Tamamen genel olarak yapılabilecek değerlerin elde edilmesinin aksine. #ifDosyanın en üstünde, mevcut durumda bir kraliçenin eklenip eklenemeyeceğine karar vermenin nedeni budur .)

Önişlemci kodunda, ive jmevcut konumu işaret ederken, düşünülen r, pve nrapor takibi hangi rütbeleri ve çapraz şu anda yerleşim için kullanılamaz. Bununla birlikte, iaynı zamanda özyinelemenin mevcut derinliğini işaretleyen sayaç olarak da ikiye katlanır, bu yüzden gerçekten diğer tüm değerler aslında bir özyinelemeden devam ederken değerleri korunacak şekilde bir alt simge olarak kullanırlar. (Ayrıca, bir önişlemci sembolünün değerini tamamen değiştirmeden değiştirmenin ciddi zorlukları nedeniyle.)

Derlenmiş program 92 çözümün tümünü basar. Çözümler doğrudan yürütülebilir dosyaya gömülüdür; önişlemci çıktısı şöyle görünür:

/* ... #included content from <stdio.h> ... */
int main(void)
{
    printf("(1 %d) (2 %d) (3 %d) (4 %d) (5 %d) (6 %d) (7 %d) (8 %d)\n",
           0 + 1, 4 + 1, 7 + 1, 5 + 1, 2 + 1, 6 + 1, 1 + 1, 3 + 1);
    printf("(1 %d) (2 %d) (3 %d) (4 %d) (5 %d) (6 %d) (7 %d) (8 %d)\n",
           0 + 1, 5 + 1, 7 + 1, 2 + 1, 6 + 1, 3 + 1, 1 + 1, 4 + 1);
    printf("(1 %d) (2 %d) (3 %d) (4 %d) (5 %d) (6 %d) (7 %d) (8 %d)\n",
           0 + 1, 6 + 1, 3 + 1, 5 + 1, 7 + 1, 1 + 1, 4 + 1, 2 + 1);
    /* ... 88 more solutions ... */
    printf("(1 %d) (2 %d) (3 %d) (4 %d) (5 %d) (6 %d) (7 %d) (8 %d)\n",
           7 + 1, 3 + 1, 0 + 1, 2 + 1, 5 + 1, 1 + 1, 6 + 1, 4 + 1);
    return 0;
}

Olmaması gerektiği halde yapılabilir.


7

İşte herhangi bir şablon olmadan bir C ++ 11 çözümü:

constexpr int trypos(
    int work, int col, int row, int rows, int diags1, int diags2,
    int rowbit, int diag1bit, int diag2bit);

constexpr int place(
    int result, int work, int col, int row, int rows, int diags1, int diags2)
{
    return result != 0 ? result
        : col == 8 ? work
        : row == 8 ? 0
        : trypos(work, col, row, rows, diags1, diags2,
                 1 << row, 1 << (7 + col - row), 1 << (14 - col - row));
}

constexpr int trypos(
    int work, int col, int row, int rows, int diags1, int diags2,
    int rowbit, int diag1bit, int diag2bit)
{
    return !(rows & rowbit) && !(diags1 & diag1bit) && !(diags2 & diag2bit)
        ? place(
            place(0, work*10 + 8-row, col + 1, 0,
                  rows | rowbit, diags1 | diag1bit, diags2 | diag2bit),
            work, col, row + 1, rows, diags1, diags2)
        : place(0, work, col, row + 1, rows, diags1, diags2);
}

int places = place(0, 0, 0, 0, 0, 0, 0);

Çözüm, FredOverflow'un cevaplarında olduğu gibi ondalık basamaklarla kodlanmıştır. GCC 4.7.1, yukarıdaki dosyayı aşağıdaki derleme kaynağına derler g++ -S -std=c++11 8q.cpp:

    .file   "8q.cpp"
    .globl  places
    .data
    .align 4
    .type   places, @object
    .size   places, 4
places:
    .long   84136275
    .ident  "GCC: (GNU) 4.7.1"
    .section    .note.GNU-stack,"",@progbits

Sembolün placesdeğeri 84136275'tir, yani birinci kraliçe a8'de, ikincisi b4'te vs.


0

c ++ şablonu, sadece bir şablon sınıfı ile tanımlanır:

template <int N, int mask, int mask2, int mask3, int remainDigit, bool fail>
struct EQ;

template <int N, int mask, int mask2, int mask3>
struct EQ<N, mask, mask2, mask3, 0, false> {
    enum _ { Output = (char [N])1 };
};

template <int N, int mask, int mask2, int mask3, int i>
struct EQ<N, mask, mask2, mask3, i, true> { };

template <int N, int mask, int mask2, int mask3, int i>
struct EQ<N, mask, mask2, mask3, i, false> {
    enum _ { _ = 
             sizeof(EQ<N*10+1, mask|(1<<1), mask2|(1<<(1+i)), mask3|(1<<(1+8-i)), i-1, 
               (bool)(mask&(1<<1)) || (bool)(mask2&(1<<(1+i))) || (bool)(mask3&(1<<(1+8-i)))>) +
             sizeof(EQ<N*10+2, mask|(1<<2), mask2|(1<<(2+i)), mask3|(1<<(2+8-i)), i-1, 
               (bool)(mask&(1<<2)) || (bool)(mask2&(1<<(2+i))) || (bool)(mask3&(1<<(2+8-i)))>) +
             sizeof(EQ<N*10+3, mask|(1<<3), mask2|(1<<(3+i)), mask3|(1<<(3+8-i)), i-1, 
               (bool)(mask&(1<<3)) || (bool)(mask2&(1<<(3+i))) || (bool)(mask3&(1<<(3+8-i)))>) +
             sizeof(EQ<N*10+4, mask|(1<<4), mask2|(1<<(4+i)), mask3|(1<<(4+8-i)), i-1, 
               (bool)(mask&(1<<4)) || (bool)(mask2&(1<<(4+i))) || (bool)(mask3&(1<<(4+8-i)))>) +
             sizeof(EQ<N*10+5, mask|(1<<5), mask2|(1<<(5+i)), mask3|(1<<(5+8-i)), i-1, 
               (bool)(mask&(1<<5)) || (bool)(mask2&(1<<(5+i))) || (bool)(mask3&(1<<(5+8-i)))>) +
             sizeof(EQ<N*10+6, mask|(1<<6), mask2|(1<<(6+i)), mask3|(1<<(6+8-i)), i-1, 
               (bool)(mask&(1<<6)) || (bool)(mask2&(1<<(6+i))) || (bool)(mask3&(1<<(6+8-i)))>) +
             sizeof(EQ<N*10+7, mask|(1<<7), mask2|(1<<(7+i)), mask3|(1<<(7+8-i)), i-1, 
               (bool)(mask&(1<<7)) || (bool)(mask2&(1<<(7+i))) || (bool)(mask3&(1<<(7+8-i)))>) +
             sizeof(EQ<N*10+8, mask|(1<<8), mask2|(1<<(8+i)), mask3|(1<<(8+8-i)), i-1, 
               (bool)(mask&(1<<8)) || (bool)(mask2&(1<<(8+i))) || (bool)(mask3&(1<<(8+8-i)))>)};
};
int main(int argc, _TCHAR* argv[])
{
    // output all solutions to eight queens problems as error messages
    sizeof(EQ<0, 0, 0, 0, 8, false>);
    return 0;
}

Böylece hata mesajı gibi görünecektir:

hata C2440: 'type cast': 'int' den 'char [15863724]' ye dönüştürülemiyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.