Giải quyết vấn đề tám nữ hoàng tại thời gian biên dịch [đóng]


39

Bạn có thể giải câu đố tám nữ hoàng tại thời gian biên dịch không?

Chọn bất kỳ định dạng đầu ra phù hợp.

Tôi đặc biệt quan tâm đến giải pháp siêu lập trình mẫu C ++, nhưng bạn có thể sử dụng các ngôn ngữ có cấu trúc tương tự, ví dụ như hệ thống loại của Haskell.

Lý tưởng nhất là metaprogram của bạn sẽ đưa ra tất cả các giải pháp. Không mã hóa.


Tại sao bạn không cho phép các ngôn ngữ khác nhau?
người dùng không xác định

@user: Bởi vì tôi quan tâm đến giải pháp C ++ TMP. Tuy nhiên, nếu bạn biết một ngôn ngữ có cấu trúc rất giống nhau, hãy đăng câu trả lời.
R. Martinho Fernandes

Tôi cũng có thể sử dụng hệ thống loại Haskell? AFAIK nó nên được hoàn thành.
FUZxxl

@FUZxxl: Vâng. Tôi sẽ chỉnh sửa câu hỏi.
R. Martinho Fernandes

Có đủ để làm giải pháp vũ phu?
đã ngừng quay ngược chiều

Câu trả lời:


50

Chương trình meta của tôi tìm thấy tất cả 92 giải pháp. Chúng được in dưới dạng thông báo lỗi:

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

Điều này có nghĩa là nữ hoàng đầu tiên nên được đặt ở y = 1, thứ hai tại y = 5, thứ ba tại y = 8, v.v.

Đầu tiên, một số hàm meta hữu ích:

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
};

Sau đó, hai hàm meta thú vị (lưu ý số ít và số nhiều):

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 {};

Biến queenslưu trữ tọa độ y của các nữ hoàng được đặt trên bảng cho đến nay. Ba biến sau đây lưu trữ các hàng và đường chéo đã được chiếm bởi các nữ hoàng. xynên tự giải thích.

Đối số đầu tiên để if_then_elsekiểm tra xem vị trí hiện tại có bị chặn hay không. Nếu đúng, đệ quy dừng lại bằng cách trả về kết quả (vô nghĩa) 0. Nếu không, nữ hoàng được đặt trên bảng và quá trình tiếp tục với cột tiếp theo.

Khi x đạt 8, chúng tôi đã tìm ra giải pháp:

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

printmẫu không có thành viên solution, trình biên dịch tạo ra lỗi.

Và cuối cùng, để bắt đầu quá trình, chúng tôi kiểm tra valuethành viên của bảng trống:

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

Chương trình hoàn chỉnh có thể được tìm thấy tại ideone .


2
Tôi thích: 1) sử dụng bitfield để lưu trữ dữ liệu, 2) lựa chọn phương thức đầu ra.
R. Martinho Fernandes

7
Quá nhiều điều tuyệt vời cho một câu trả lời.
st0le

Nó cũng không nên xuất các giá trị x?
DeadMG

2
@DeadMG Giá trị x của mỗi vị trí nữ hoàng là vị trí của nó trong chuỗi (1-8).
Briguy37

22

Tôi đã đưa ra một giải pháp sử dụng hệ thống loại Haskell. Tôi đã googled một chút cho một giải pháp hiện có cho vấn đề ở cấp giá trị , thay đổi nó một chút, và sau đó nâng nó lên mức loại. Phải mất rất nhiều sáng tạo lại. Tôi cũng đã phải kích hoạt một loạt các tiện ích mở rộng GHC.

Đầu tiên, vì số nguyên không được phép ở cấp độ loại, tôi cần phải phát minh lại các số tự nhiên một lần nữa, lần này là các loại:

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

Thuật toán tôi điều chỉnh tạo ra các phép cộng và phép trừ trên tự nhiên, vì vậy tôi cũng phải phát minh lại chúng. Các hàm ở mức kiểu được định nghĩa với các lớp loại. Điều này đòi hỏi các phần mở rộng cho nhiều lớp loại tham số và các phụ thuộc chức năng. Các lớp loại không thể "trả về giá trị", vì vậy chúng tôi sử dụng một tham số phụ cho điều đó, theo cách tương tự như PRITAL.

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

Đệ quy được thực hiện với các xác nhận lớp, vì vậy cú pháp có vẻ hơi lạc hậu.

Tiếp theo là booleans:

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

Và một chức năng để so sánh bất bình đẳng:

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

Và danh sách ...

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

ifs cũng bị thiếu ở cấp độ loại ...

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

Và với điều đó, tất cả các máy móc hỗ trợ tôi sử dụng đã được đưa ra. Thời gian để giải quyết vấn đề chính nó!

Bắt đầu với một chức năng để kiểm tra nếu thêm một nữ hoàng vào một bảng hiện có là ok:

-- 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)]

Lưu ý việc sử dụng các xác nhận lớp để có được kết quả trung gian. Bởi vì các giá trị trả về thực sự là một tham số phụ, chúng ta không thể gọi các xác nhận trực tiếp từ nhau. Một lần nữa, nếu bạn đã sử dụng PRITAL trước khi bạn có thể thấy phong cách này hơi quen thuộc.

Sau khi tôi thực hiện một vài thay đổi để loại bỏ nhu cầu về lambdas (điều mà tôi có thể thực hiện, nhưng tôi quyết định rời đi vào một ngày khác), đây là giải pháp ban đầu giống như:

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]

maplà một hàm bậc cao hơn. Tôi nghĩ rằng việc thực hiện các hàm meta bậc cao sẽ gặp quá nhiều rắc rối (lại là lambdas) vì vậy tôi chỉ thực hiện một giải pháp đơn giản hơn: vì tôi biết các chức năng nào sẽ được ánh xạ, tôi có thể triển khai các phiên bản chuyên biệt mapcho từng chức năng, vì vậy những thứ đó không chức năng bậc cao.

-- 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)

Và hàm meta cuối cùng có thể được viết ngay bây giờ:

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

Tất cả những gì còn lại là một loại trình điều khiển để dỗ máy móc kiểm tra loại để tìm ra giải pháp.

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

Chương trình meta này được cho là chạy trên trình kiểm tra loại, vì vậy người ta có thể kích hoạt ghcivà yêu cầu loại queens eight:

> :t queens eight

Điều này sẽ vượt quá giới hạn đệ quy mặc định khá nhanh (đó là 20). Để tăng giới hạn này, chúng ta cần gọi ghcivới -fcontext-stack=Ntùy chọn, Nđộ sâu ngăn xếp mong muốn (N = 1000 và mười lăm phút là không đủ). Tôi chưa thấy chạy này để hoàn thành, vì phải mất một thời gian rất dài, nhưng tôi đã xoay sở để chạy đến queens four.

một chương trình đầy đủ về ideone với một số máy móc để in đẹp các loại kết quả, nhưng chỉ queens twocó thể chạy mà không vượt quá giới hạn :(


Bên cạnh một giải pháp thú vị, đây là một tài liệu tham khảo thú vị về những gì có thể được thực hiện với logic lớp / thể hiện
Michael Klein

11

C, thông qua bộ tiền xử lý

Tôi nghĩ rằng ủy ban ANSI đã đưa ra một lựa chọn có ý thức là không mở rộng bộ tiền xử lý C đến mức hoàn thành Turing. Trong mọi trường hợp, nó không thực sự đủ mạnh để giải quyết vấn đề tám nữ hoàng. Không phải trong bất kỳ loại thời trang nói chung.

Nhưng nó có thể được thực hiện, nếu bạn sẵn sàng mã hóa các bộ đếm vòng lặp. Tất nhiên, không có cách lặp thực sự, nhưng bạn có thể sử dụng tự bao gồm (thông qua #include __FILE__) để có được một loại đệ quy giới hạn.

#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

Mặc dù số lượng khủng khiếp của nội dung lặp đi lặp lại, hãy để tôi đảm bảo với bạn rằng nó thực sự đang giải quyết vấn đề tám nữ hoàng bằng thuật toán. Thật không may, một điều mà tôi không thể làm với bộ tiền xử lý là triển khai cấu trúc dữ liệu ngăn xếp đẩy xuống chung. Kết quả cuối cùng là tôi phải mã hóa giá trị của ibất cứ nơi nào nó được sử dụng để chọn giá trị khác để đặt. (Trái ngược với việc truy xuất các giá trị, có thể được thực hiện hoàn toàn nói chung. Đó là lý do tại sao #ifở đầu tệp, đó là quyết định nếu một nữ hoàng có thể được thêm vào vị trí hiện tại, không cần phải lặp lại tám lần.)

Trong mã tiền xử lý, ijchỉ ra vị trí hiện tại đang được xem xét, trong khi r, pntheo dõi trong đó cấp bậc và đường chéo hiện không có sẵn cho vị trí. Tuy nhiên, icũng tăng gấp đôi khi bộ đếm đánh dấu độ sâu đệ quy hiện tại, vì vậy thực sự tất cả các giá trị khác thực sự sử dụng i như một loại chỉ mục, để các giá trị của chúng được bảo toàn khi tiếp tục từ đệ quy. (Và cũng vì khó khăn nghiêm trọng trong việc sửa đổi giá trị của biểu tượng tiền xử lý mà không thay thế hoàn toàn.)

Chương trình biên dịch in tất cả 92 giải pháp. Các giải pháp được nhúng trực tiếp vào thực thi; đầu ra của bộ tiền xử lý trông như thế này:

/* ... #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;
}

Nó có thể được thực hiện, mặc dù rõ ràng là không nên.


7

Đây là giải pháp C ++ 11 mà không cần bất kỳ mẫu nào:

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);

Giải pháp được mã hóa dưới dạng chữ số thập phân, như trong câu trả lời của FredOverflow. GCC 4.7.1 biên dịch tệp trên vào nguồn lắp ráp sau với 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

Giá trị của biểu tượng placeslà 84136275, tức là nữ hoàng đầu tiên ở a8, lần thứ hai tại b4, v.v.


0

Mẫu c ++, chỉ có một lớp mẫu được xác định:

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;
}

vì vậy thông báo lỗi sẽ giống như:

lỗi C2440: 'kiểu cast': không thể chuyển đổi từ 'int' thành 'char [15863724]'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.