সংকলন সময়ে আটটি রানী সমস্যা সমাধান করুন [বন্ধ]


39

সংকলন সময়ে আপনি আটটি কুইন ধাঁধা সমাধান করতে পারেন ?

যে কোনও উপযুক্ত আউটপুট ফর্ম্যাট চয়ন করুন।

আমি বিশেষত একটি সি ++ টেম্পলেট বিপণন সমাধানে আগ্রহী, তবে আপনি এমন ভাষা ব্যবহার করতে পারেন যা অনুরূপ নির্মাণ রয়েছে যেমন, উদাহরণস্বরূপ, হাস্কেলের টাইপ সিস্টেম।

আদর্শভাবে আপনার রূপকগুলিতে সমস্ত সমাধান আউটপুট হবে। হার্ডকোডিং নেই।


কেন আপনি বিভিন্ন ভাষায় অনুমতি দিচ্ছেন না?
ব্যবহারকারী অজানা

@ ব্যবহারকারী: কারণ আমি একটি সি ++ টিএমপি সমাধানে আগ্রহী। আপনি যদি এমন কোনও ভাষা সম্পর্কে জানেন যা এর সাথে খুব অনুরূপ নির্মাণ রয়েছে তবে নির্দ্বিধায় উত্তর পোস্ট করুন feel
আর মার্টিনহো ফার্নান্দিস

আমি কি হাস্কেলের টাইপ সিস্টেমটি ব্যবহার করতে পারি? এএফআইএকি এটি সম্পূর্ণরূপে ট্যুর করা উচিত।
FUZxxl

@FUZxxl: হ্যাঁ আমি প্রশ্নটি সম্পাদনা করব।
আর মার্টিনহো ফার্নান্দিস

নিষ্ঠুর-বল-সমাধান কি যথেষ্ট?
পাল্টা

উত্তর:


50

আমার মেটা প্রোগ্রামটি সমস্ত 92 সমাধান সন্ধান করে। এগুলি ত্রুটি বার্তা হিসাবে মুদ্রিত হয়:

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

এর অর্থ প্রথম রানিকে y = 1, দ্বিতীয়টি y = 5, তৃতীয়টি y = 8 এবং আরও কিছুতে রাখা উচিত।

প্রথমত, কিছু দরকারী মেটা-ফাংশন:

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

তারপরে, দুটি আকর্ষণীয় মেটা-ফাংশন (একক এবং বহুবচন নোট করুন):

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

ভেরিয়েবল queensবোর্ডে রাখা রাণীগুলির y স্থানাঙ্কগুলি সঞ্চয় করে। নিম্নলিখিত তিনটি ভেরিয়েবলগুলি সারি এবং ত্রিভুজগুলি সংরক্ষণ করে যা ইতিমধ্যে রানী দ্বারা দখল করা হয়েছে। xএবং yস্ব-ব্যাখ্যামূলক হওয়া উচিত।

if_then_elseবর্তমান অবস্থানটি অবরুদ্ধ কিনা তা যাচাই করার প্রথম যুক্তি । যদি এটি হয় তবে পুনরাবৃত্তি (অর্থহীন) ফলাফলটি 0 দিয়ে ফিরে আসবে Otherwise

X যখন 8 এ পৌঁছায়, আমরা একটি সমাধান পেয়েছি:

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

যেহেতু printটেমপ্লেটের কোনও সদস্য নেই solution, সংকলক একটি ত্রুটি উত্পন্ন করে।

এবং পরিশেষে, প্রক্রিয়াটি শুরু করার জন্য, আমরা valueখালি বোর্ডের সদস্যটিকে পরীক্ষা করব :

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

সম্পূর্ণ প্রোগ্রামটি আদর্শে পাওয়া যাবে


2
আমি পছন্দ করি: 1) ডেটা সঞ্চয় করতে বিটফিল্ড ব্যবহার করে, 2) আউটপুট পদ্ধতির পছন্দ।
আর মার্টিনহো ফার্নান্দিস

7
একটি উত্তরের জন্য খুব বেশি দুর্দান্ততা।
st0le

এটি কি এক্স মান আউটপুট করা উচিত নয়?
ডেডএমজি

2
@ ডেডএমজি প্রতিটি রানির অবস্থানের এক্স-মানটি স্ট্রিংয়ের (1-8) অবস্থান)
ব্রিগ্যুই 37

22

আমি এমন একটি সমাধান নিয়ে এসেছি যা হাস্কেল টাইপ সিস্টেম ব্যবহার করে। মান স্তরের সমস্যার বিদ্যমান সমাধানের জন্য আমি কিছুটা গুগল করেছিলাম , এটিকে কিছুটা পরিবর্তন করেছি, এবং তারপরে এটিকে টাইপ স্তরে তুলে নিয়েছি । এটি অনেকটা নতুন করে নিয়েছিল। আমারও একগুচ্ছ জিএইচসি এক্সটেনশান সক্ষম করতে হয়েছিল।

প্রথমত, যেহেতু টাইপ স্তরে পূর্ণসংখ্যার অনুমতি দেওয়া হয় না, তাই প্রাকৃতিক সংখ্যাগুলি পুনরায় পুনরায় উদ্ভাবন করা দরকার, টাইপ হিসাবে:

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

আমি যে অ্যালগরিদমকে মানিয়ে নিয়েছি সেগুলি প্রাকৃতিকগুলিতে সংযোজন এবং বিয়োগগুলি করে, তাই আমাকে এগুলিও পুনরায় উদ্ভাবন করতে হয়েছিল। টাইপ স্তরের কার্যকারিতা সংজ্ঞা দেওয়া হয় টাইপ শ্রেণীর অবলম্বনে। একাধিক প্যারামিটার ধরণের শ্রেণি এবং কার্যকরী নির্ভরতাগুলির জন্য এটিগুলির জন্য এক্সটেনশানগুলির প্রয়োজন। প্রকারের ক্লাসগুলি "মানগুলি ফেরত" দিতে পারে না, সুতরাং আমরা তার জন্য একটি অতিরিক্ত প্যারামিটার ব্যবহার করি, PROLOG এর অনুরূপ।

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

পুনরাবৃত্তি শ্রেণিবদ্ধকরণের সাথে প্রয়োগ করা হয়, সুতরাং বাক্যবিন্যাসটি কিছুটা পিছনে দেখায়।

পরবর্তী বুলিয়ান ছিল:

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

এবং অসমতার তুলনা করার জন্য একটি ফাংশন:

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

এবং তালিকা ...

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

ifটাইপ স্তরেও নিখোঁজ রয়েছে ...

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

এবং এটির সাথে সাথে, আমি ব্যবহৃত সমস্ত সহায়ক যন্ত্রপাতি ছিল। সমস্যাটি নিজেই সমাধান করার সময়!

কোনও বিদ্যমান বোর্ডে রানী যুক্ত করা ভাল কিনা তা পরীক্ষা করার জন্য একটি ফাংশন দিয়ে শুরু করা:

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

মধ্যবর্তী ফলাফল পেতে শ্রেণিবদ্ধকরণের ব্যবহার লক্ষ করুন। যেহেতু রিটার্ন মানগুলি একটি অতিরিক্ত প্যারামিটার হয়, আমরা কেবল একে অপরের কাছ থেকে সরাসরি দৃ .়তাগুলি কল করতে পারি না। আবার আপনি যদি PROLOG ব্যবহার করেন তবে এই স্টাইলটি কিছুটা পরিচিত হতে পারে।

ল্যাম্বডাসের প্রয়োজনীয়তা অপসারণ করার জন্য আমি কয়েকটি পরিবর্তন করার পরে (যা আমি প্রয়োগ করতে পারতাম, তবে আমি অন্য একদিনের জন্য চলে যাবার সিদ্ধান্ত নিয়েছিলাম), এটির মূল সমাধানটি দেখে মনে হয়েছিল:

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]

mapএকটি উচ্চতর ক্রম ফাংশন। আমি ভেবেছিলাম উচ্চতর অর্ডার মেটা-ফাংশনগুলি প্রয়োগ করা খুব বেশি ঝামেলা হবে (আবার ল্যাম্বডাস) সুতরাং আমি কেবল একটি সহজ সমাধান নিয়ে চলেছি: যেহেতু আমি জানি যে কী ফাংশন ম্যাপ করা হবে map, তাই আমি প্রতিটিটির জন্য বিশেষ সংস্করণগুলি প্রয়োগ করতে পারি , যাতে সেগুলি না হয় উচ্চতর আদেশ ক্রিয়াকলাপ।

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

এবং শেষ মেটা-ফাংশনটি এখনই লেখা যেতে পারে:

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

বাকিগুলি হ'ল সমাধানগুলি কার্যকর করার জন্য টাইপ-চেকিং মেশিনারিটিকে কক্সবাজারে চালিত করার জন্য একরকম ড্রাইভার।

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

এই মেটা-প্রোগ্রামটি টাইপ চেকারে চালিত হওয়ার কথা, সুতরাং কেউ গুলি চালিয়ে ghciপ্রকারটি জানতে চাইতে পারে queens eight:

> :t queens eight

এটি বরং দ্রুত ডিফল্ট পুনরাবৃত্তি সীমা অতিক্রম করবে (এটি একটি ম্যাসেজ 20)। এই সীমাটি বাড়ানোর জন্য, আমাদের বিকল্পটির ghciসাথে আবেদন করতে হবে -fcontext-stack=N, যেখানে Nপছন্দসই স্ট্যাকের গভীরতা রয়েছে (এন = 1000 এবং পনের মিনিটই যথেষ্ট নয়)। আমি এই রানটি এখনও সম্পূর্ণ করতে দেখিনি, কারণ এটি অনেক দীর্ঘ সময় নেয় তবে আমি চালিয়ে যেতে পেরেছি queens four

আছে একটি পুরো প্রোগ্রাম চমত্কার ফলাফলের ধরনের মুদ্রণের জন্য কিছু যন্ত্রপাতি দিয়ে ideone উপর, কিন্তু এর queens twoসীমা মাত্রাধিক ছাড়াই এটিকে চালাতে পারবেন :(


একটি আকর্ষণীয় সমাধান ছাড়াও, শ্রেণি / উদাহরণ যুক্তি দিয়ে কী করা যায় তার একটি মজাদার রেফারেন্স
মাইকেল ক্লিন

11

সি, প্রিপ্রোসেসর মাধ্যমে

আমি মনে করি এএনএসআই কমিটি সি প্রিপ্রোসেসরটিকে টুরিং-সম্পূর্ণ হওয়ার উপক্রম না বাড়ানোর জন্য সচেতন নির্বাচন করেছে। যাই হোক না কেন, আটটি রানীর সমস্যা সমাধানের পক্ষে এটি যথেষ্ট শক্তিশালী নয়। কোনও ধরণের সাধারণ ফ্যাশনে নয়।

তবে আপনি যদি লুপ কাউন্টারগুলিকে হার্ড-কোড করতে ইচ্ছুক হন তবে এটি করা যায়। লুপ করার কোনও আসল উপায় নেই অবশ্যই, তবে আপনি #include __FILE__সীমিত ধরণের পুনরাবৃত্তি পেতে স্ব-অন্তর্ভুক্তি (মাধ্যমে ) ব্যবহার করতে পারেন ।

#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

পুনরাবৃত্তিমূলক সামগ্রীর ভয়াবহ পরিমাণ সত্ত্বেও, আমি আপনাকে নিশ্চিত করে তুলি যে এটি সত্যই আটটি রানীর সমস্যাটি অ্যালগরিদমিকভাবে সমাধান করছে। দুর্ভাগ্যক্রমে একটি জিনিস যা আমি প্রিপ্রোসেসরটির সাথে না করতে পারি তা হ'ল একটি সাধারণ পুশ-ডাউন স্ট্যাক ডেটা স্ট্রাকচার প্রয়োগ করে। আপশটটি হ'ল আমাকে iসেট করতে অন্য মানটি নির্বাচন করতে যেখানেই ব্যবহৃত হয়েছিল তার মান হার্ড-কোড করতে হয়েছিল। (মানগুলি পুনরুদ্ধারের বিপরীতে, যা সম্পূর্ণরূপে সম্পূর্ণভাবে সম্পন্ন করা যায় That's সেজন্যই #ifফাইলের শীর্ষে, যা রানিকে বর্তমান অবস্থানে যুক্ত করা যায় কিনা তা স্থির করে, আটবার পুনরাবৃত্তি করার দরকার পড়েনি))

প্রাক প্রসেসর কোড মধ্যেই iএবং jবর্তমান অবস্থান নির্দেশ বিবেচনা করা হচ্ছে, যখন r, pএবং nসম্পর্কে অবগত থাকুন যার পদমর্যাদার এবং কর্ণ বর্তমানে অবস্থানের জন্য অনুপলব্ধ। যাইহোক, iপুনরাবৃত্তির বর্তমান গভীরতা চিহ্নিতকারী হিসাবে কাউন্টার হিসাবে দ্বিগুণও হয়, তাই অন্য সমস্ত মানগুলি প্রকৃতপক্ষে i কে এক ধরণের সাবস্ক্রিপ্ট হিসাবে ব্যবহার করে, যাতে পুনরাবৃত্তি থেকে পুনরায় শুরু করার সময় তাদের মানগুলি সংরক্ষণ করা যায়। (এবং এটি সম্পূর্ণরূপে প্রতিস্থাপন না করে প্রিপ্রোসেসর চিহ্নের মান সংশোধন করার গুরুতর অসুবিধার কারণেও))

সংকলিত প্রোগ্রামটি সমস্ত 92 টি সমাধান সমাধান করে। সমাধানগুলি এক্সিকিউটেবলের মধ্যে সরাসরি এম্বেড করা হয়; প্রিপ্রসেসর আউটপুটটি দেখতে এমন দেখাচ্ছে:

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

এটি করা যেতে পারে, যদিও এটি স্পষ্টভাবে করা উচিত নয়।


7

এখানে কোনও টেমপ্লেট ছাড়াই একটি সি ++ 11 সমাধান রয়েছে:

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

ফ্রেডওভারফ্লো এর উত্তরগুলির মতো সমাধান দশমিক অঙ্ক হিসাবে এনকোড করা হয়েছে। জিসিসি 4.7.1 উপরের ফাইলটি নিম্নলিখিত সমাবেশ উত্সের সাথে সংকলন করে 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

প্রতীকটির মান places84136275, অর্থাৎ প্রথম রানী a8 এ, দ্বিতীয়টি B4 এ রয়েছে etc.


0

সি ++ টেম্পলেট, কেবলমাত্র একটি টেম্পলেট শ্রেণীর সংজ্ঞা দেওয়া হয়েছে:

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

সুতরাং ত্রুটি বার্তাটি দেখতে হবে:

ত্রুটি C2440: 'টাইপ কাস্ট': 'ইনট' থেকে 'চর [15863724]' তে রূপান্তর করতে পারে না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.