八皇后问题非桟的解决方法

来源:互联网 发布:全球数据库 编辑:程序博客网 时间:2024/05/18 01:06

     主要难点是判断数组元素位置是否符合皇后放置规定。

判断某个数组元素是否符合要求时应该注意判断一下6个方面:

该元素的同行;

该元素的同列;

该元素的左下;

该元素的右下;

该元素的左上;

该元素的右上;

该方法如下:

bool guarded(int c[][8],int a,int b)//判断位置是否符合要求{int i;for(i=0;i<8;i++)//判断同列{       if(c[a][i]==1)   return false;}for(i=0;i<8;i++)//判断同行{       if(c[i][b]==1)   return false;}for(i=0;(a-i>=0)&&(b+i<8);i++)//判断左下方元素{if(c[a-i][b+i]==1) return false;}for(i=0;(a+i<8)&&(b+i<8);i++)//判断右下方元素{if(c[a+i][b+i]==1) return false;}for(i=0;(a+i<8)&&(b-i>=0);i++)//判断右上方元素{if(c[a+i][b-i]==1) return false;}for(i=0;(a-i>=0)&&(b-i>=0);i++)//判断左上方元素{if(c[a-i][b-i]==1) return false;}return true;}
该算法如下:

#include<iostream.h>bool guarded(int c[][8],int a,int b)//判断位置是否符合要求{int i;for(i=0;i<8;i++)//判断同列{       if(c[a][i]==1)   return false;}for(i=0;i<8;i++)//判断同行{       if(c[i][b]==1)   return false;}for(i=0;(a-i>=0)&&(b+i<8);i++)//判断左下方元素{if(c[a-i][b+i]==1) return false;}for(i=0;(a+i<8)&&(b+i<8);i++)//判断右下方元素{if(c[a+i][b+i]==1) return false;}for(i=0;(a+i<8)&&(b-i>=0);i++)//判断右上方元素{if(c[a+i][b-i]==1) return false;}for(i=0;(a-i>=0)&&(b-i>=0);i++)//判断左上方元素{if(c[a-i][b-i]==1) return false;}return true;}void start(int a[][8]){int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){a[i][j]=0;}}}void printf(int a[][8])//打印输出数组{  int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){cout<<a[i][j]<<" ";}cout<<endl;}}//bool nidaye()//{return true;}//void panduan(int a[][8])//{//  int i,j;//for(i=0;i<8;i++)//{//for(j=0;j<8;j++)//{///cout<<guarded(a,i,j)<<" ";//}//cout<<endl;//}//}int sum1(int a[][8])//判断皇后数量{intsum=0;  for(int i=0;i<8;i++){  for(int j=0;j<8;j++)  {  if(a[i][j]==1)  sum=sum+1;  }}  return sum;}void main(){int a[8][8];start(a);for(int k=0;k<8;k++){for(int l=0;l<8;l++){a[k][l]=1;//每次置为一的元素不同for(int i=0;i<8;i++)//循环判断每个元素位置是否符合要求{for(int j=0;j<8;j++){if(guarded(a,i,j)){a[i][j]=1;}}}     if(sum1(a)==8)//判断皇后有8个时{printf(a);}    start(a);//注意每次循环将数组初始化}}}




0 0
原创粉丝点击