آرین سلیمان‌زاده
  • خانه
  • وبلاگ
  • پادکست‌ها
  • ویدیوها
  • کتابخانه
  • تماس با من
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
پنل•تماس سریع

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

درخواست همکاری یا مشاوره

پیام خود را درباره همکاری، مشاوره، توسعه محصول یا پروژه نرم‌افزاری ارسال کنید.

LinkedInپاسخ سریع
کتابخانه الگوریتم ←/مسائل کلاسیک/مسئله N وزیر
یادداشت کامل الگوریتم

مسئله N وزیر

N-Queens Problem

N-Queens باید N وزیر را روی صفحه N×N قرار دهد به‌طوری‌که هیچ دو وزیری در یک row، column یا diagonal نباشند. Backtracking انتخاب‌ها را امتحان می‌کند و به‌محض conflict مسیر را قطع می‌کند.

نوعالگوریتمدستهمسائل کلاسیکسطحپیشرفتهپیچیدگی معمولVaries by implementation / input constraints
جواب کوتاه و حرفه‌ای

اول این مفهوم را در ذهن نگه دار

N-Queens باید N وزیر را روی صفحه N×N قرار دهد به‌طوری‌که هیچ دو وزیری در یک row، column یا diagonal نباشند. Backtracking انتخاب‌ها را امتحان می‌کند و به‌محض conflict مسیر را قطع می‌کند.

01
توضیح ساده

چطور کار می‌کند؟ ساده و مرحله‌ای

01

در هر row فقط یک وزیر قرار بده.

02

columnها و diagonalهای اشغال‌شده را با Set یا Bitmask نگه دار، به row بعد برو و بعد از برگشت انتخاب را undo کن.

02
روند اجرا

الگوریتم را به شکل تصمیم‌های پشت سر هم بخوان

01

constraint و edge case را بازگو کن.

02

pattern و invariant را پیدا کن.

03

قبل از کد یک مثال کوچک را دستی اجرا کن.

یک مثال کوچک برای فهم بهتر

یک ورودی خیلی کوچک را دستی اجرا کن و بعد از هر عملیات مهم state را بنویس. برای مسئله N وزیر هدف این است که invariant را ببینی، نه اینکه کد را حفظ کنی.

پیاده‌سازی خوانا با JavaScriptJavaScript
function solveNQueens(n) {
  const cols = new Set(), diag1 = new Set(), diag2 = new Set();
  const board = Array(n).fill(-1), solutions = [];
  function place(row) {
    if (row === n) { solutions.push([...board]); return; }
    for (let col = 0; col < n; col++) {
      if (cols.has(col) || diag1.has(row-col) || diag2.has(row+col)) continue;
      cols.add(col); diag1.add(row-col); diag2.add(row+col); board[row] = col;
      place(row + 1);
      cols.delete(col); diag1.delete(row-col); diag2.delete(row+col);
    }
  }
  place(0);
  return solutions;
}
این کد را چطور بخوانی؟

syntax را حفظ نکن. stateای را که در هر خط تغییر می‌کند دنبال کن و آن را به invariant توضیح‌داده‌شده در بالا وصل کن.

پیچیدگی

Varies by implementation / input constraints

این Complexity را حفظی نگو. اول مشخص کن مربوط به کدام عملیات یا بعد ورودی است؛ بعد هزینه را از روی loopها، عمق recursion، عملیات ساختمان داده و فرض‌های preprocessing نتیجه بگیر.

03
چه زمانی استفاده کنیم؟

موارد مناسب

  • وقتی invariant pattern با constraint مسئله هماهنگ است از آن استفاده کن.
04
اشتباهات رایج

کجا معمولاً اشتباه می‌کنیم؟

  • قبل از تعریف invariant مستقیم سراغ کد نرو.
  • قبل از جواب صحیح ساده، زود optimization نکن.
در مصاحبه چطور توضیح بدهیم؟

مدل یک پاسخ حرفه‌ای

نکته اصلی pruning است؛ Backtracking همه boardهای کامل را کورکورانه نمی‌سازد بلکه prefixهای نامعتبر را خیلی زود حذف می‌کند.

مسئله→ایده اصلی→Invariant / State→Big-O→Trade-off
چند سؤال مصاحبه‌ای سریع

مسئله N وزیر چه مسئله‌ای را حل می‌کند؟

N-Queens باید N وزیر را روی صفحه N×N قرار دهد به‌طوری‌که هیچ دو وزیری در یک row، column یا diagonal نباشند. Backtracking انتخاب‌ها را امتحان می‌کند و به‌محض conflict مسیر را قطع می‌کند.

درباره Complexity چه چیزی باید بگویم؟

پیچیدگی معمول اینجا Varies by implementation / input constraints است، اما جواب کامل باید این هزینه را به representation، constraint ورودی و عملیات غالب وصل کند.

رایج‌ترین اشتباه چیست؟

قبل از تعریف invariant مستقیم سراغ کد نرو.

موضوعات مرتبط برای ادامه مطالعهPatternهای حل مسئلهEdge CaseTrade-off پیچیدگی
منبع و مطالعه بیشتر

این درس برای مطالعه آرام و آمادگی مصاحبه به‌صورت مستقل نوشته شده و فهرست موضوعات آن از trekhleb/javascript-algorithms الهام گرفته است. مخزن اصلی implementationها، testها و README تخصصی هر موضوع را دارد.

باز کردن مخزن اصلی ↗
آرین سلیمان‌زاده

پورتفولیوی شخصی با تمرکز بر Agentic CRM، سامانه‌های هوشمند کسب‌وکار، مهندسی مدرن وب، طراحی سیستم‌های رابط کاربری و توسعه محصولات نرم‌افزاری کاربردی.

لینک‌های سریع

  • درباره من
  • وبلاگ
  • کتابخانه
  • تماس

ارتباط

  • soleimanzadeh.a.work@gmail.com
  • soleimanzadeh.uni@gmail.com

در دسترس: روزهای کاری

معمولاً پاسخ در ۲۴ ساعت

خبرنامه

به‌روزرسانی‌های مربوط به نوشته‌ها، پروژه‌ها و انتشارهای جدید را دریافت کنید.

© 2026 ariansoleimanzadeh.dev — تمامی حقوق محفوظ است.

لینکدین