来自「用c++处理把皇后问题」· 代码 · 共 62 行

TXT
62
字号
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
bool rows[8], diag[17],diag2[17];
int result[8],total;

// 將 (r,c) 放置一個皇后
void select (int r,int c,int cnt){
 rows[r]=true;
 result[cnt]=r;
 diag[r+c]=true;
 diag2[r-c+9]=true;
}

// 取消(r,c) 放置的皇后
void unselect (int r,int c){
 rows[r]=false;
 diag[r+c]=false;
 diag2[r-c+9]=false;
}

// 判斷(row,col) 是否可以合法放置皇后
bool valid(int row,int col){
 return !(rows[row]||diag[row+col]||diag2[row-col+9]);
}

// 搜尋第 col行(column),找出合法的列rows
void dfs(int col,int cnt){
 if(cnt>=8  ){
  printf("%2d      ",total+1);

  for(int i=0;i<8;i++)
   		printf("%d",result[i]+1);
   printf("\n");

   total++;
 } else
 for(int i=0;i<8;i++)
   if(valid(i,col) ){
    select(i,col,cnt);
    dfs(col+1,cnt+1);
    unselect(i,col);
   }
}

void init(){
  total=0;
  memset(diag,0,sizeof(bool)*30);
  memset(diag2,0,sizeof(bool)*30);
  memset(rows,0,sizeof(bool)*8);
}

int main(int argc,char **argv){
  init();
 printf("SOLN       COLUMN\n");
 printf(" #      1 2 3 4 5 6 7 8\n\n");
  dfs(0,0);
 return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?