八皇后问题的解法

来源:互联网 发布:linux下延时函数 编辑:程序博客网 时间:2024/04/30 15:10

//八皇后问题:在8×8的国际象棋棋盘上,安放8个皇后,
//要求没有一个皇后能够“吃掉”任何其他一个皇后,
//即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或同一对角线。


#include <stdio.h>
int M[8];//依次存放八个皇后的列号,从0开始,即M[i]=j表示i行j列摆一个皇后

//检查第j个皇后是否符合要求
int check(int j)
{ int i;

 for(i=0;i<j;++i)
 { if(M[j]==M[i]) return false;//同列'|'
  if((j-i)==(M[j]-M[i])) return false;//斜线'/'
  if((j-i)==(M[i]-M[j])) return false;//斜线'/'
 }
 return true;
};

//显示结果
int t=0;//第t个解法
void show()
{ printf("/n第%02d种摆法:",++t);
 for(int i=0;i<8;++i)
  printf("%d ",M[i]);
};

void queen(int n)
{ int i;
 if(8==n)
 { show();
  return;
 }else
 { for(i=0;i<8;i++)
  { M[n]=i;
   if(check(n))
    queen(n+1); //递归
  }
 }
};

//递归求解
void test1()
{ queen(0);
};

//回溯求解
void test2()
{ int i,j;

 for(i=0;i<8;++i)//i行
 { for(j=0;j<8;++j)//j列
  { M[i]=j;
  back:
   if(check(i)) break;
  }
  if(j<8) continue;//i行j列摆一个皇后
  do
  {
  next:
   --i;//行回溯
   if(i<0) return;//完成
   j=++M[i]; 
  }while(j>=8);
  goto back;//列回溯
 }
 show();
 goto next;
};

 

int main()

{test1();

//test2();

return true;

}

原创粉丝点击