C语言求8皇后问题的回溯程序,要简单的!!
发布网友
发布时间:2023-09-28 15:21
我来回答
共4个回答
热心网友
时间:2024-10-08 10:30
#include "stdio.h"
int attacked(int *array,int position){
int flag=-1;
float step;
if(position==1) return flag;
for(step=1.00;step<position;step++){
if(*(array+(int)step)==*(array+position)||step==position) return
1;
if(((*(array+(int)step)-*(array+position))/(step-position))==1||((*
(array+(int)step)-*(array+position))/(step-position))==-1){
flag=1;
break;
}
}
return flag;
}
void main(void){
int countSum,queenSum,printCount,*queenArray,queenPosition=0;
int tempArray[20]={6666,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
countSum=1;
queenArray=tempArray;
printf("input you queenSum here:");
scanf("%d",&queenSum);
fflush(stdin);
if(queenSum<4){
printf("the %d queen's sum is 0\n",queenSum);
return;
}
for(;;){
if(countSum<queenSum){
if(countSum==1&&*(queenArray+countSum)==1) countSum++;
if(attacked(queenArray,countSum)==1){
if(*(queenArray+countSum)>=queenSum){
if(*(queenArray+countSum-1)<queenSum){
++*(queenArray+(--countSum));
*(queenArray+countSum+1)=0;
}
else{
*(queenArray+countSum--)=0;
if(*(queenArray+countSum)<queenSum) ++*(queenArray+countSum);
else{
if(countSum==1&&*(queenArray+countSum)==queenSum) break;
*(queenArray+countSum--)=0;
++*(queenArray+countSum);
}
}
}
else
++*(queenArray+countSum);
}
else
++*(queenArray+(++countSum));
}
else{
if(attacked(queenArray,countSum)==1){
if(*(queenArray+countSum)>=queenSum){
if(*(queenArray+countSum-1)<queenSum){
++*(queenArray+(--countSum));
*(queenArray+countSum+1)=0;
continue;
}
else{
*(queenArray+countSum--)=0;
if(*(queenArray+countSum)<queenSum) ++*(queenArray+countSum);
else{
*(queenArray+countSum--)=0;
++*(queenArray+countSum);
}
continue;
}
}
else {
++*(queenArray+countSum);
continue;
}
}
queenPosition++;
for(printCount=1;printCount<=queenSum;printCount++)
printf("%3d%",*(queenArray+printCount));
if(printCount>=queenSum) printf("\n");
if(*(queenArray+countSum)>=queenSum){
++*(queenArray+(--countSum)); //the "++" priority is different
from turbo C
*(queenArray+countSum+1)=0;
}
++*(queenArray+countSum);
}
}
printf("the %d queen's sum is %d\n",queenSum,queenPosition);
}
热心网友
时间:2024-10-08 10:31
#include "stdafx.h"
#include <iostream.h>
int bijiao(int q[],int row,int col)
{
int x;
for(x=0;x<row;x++)
{ if(col==q[x] || row+col==x+q[x] || row-col==x-q[x] )
return 0;
}
return 1;
}
int anquan(int q[],int row)
{
int col;
for(col=q[row]+1;col<8;col++){
if( bijiao(q,row,col) )
return col;
}
return -1;
}
int huanghou(int q[])
{
int row,col;
for(row=1;row<8;row++){
q[row]=-1;
}
q[0]=0;
row=1;
while(row>=0&&row<8){
col=anquan(q,row);
if(col!=-1)
q[row++]=col;
else
q[row--]=-1;
}
return (8==row);
}
void main()
{
int q[8];
int x;
huanghou(q);
for(x=0;x<8;x++)
printf(" %2d ",q[x]);
}
尽量最简单化了
热心网友
时间:2024-10-08 10:31
#include <stdio.h>
#include <memory.h>
int sum,lie[8],xie[15],xie1[15];
void q(int n)
{
for(int i=0;i<8;i++)
{
if(lie[i]!=1&&xie[n+i]!=1&&xie1[i-n+7]!=1)
{
lie[i]=xie[n+i]=xie1[i-n+7]=1;
if(n==7)
sum++;
else
q(n+1);
lie[i]=xie[n+i]=xie1[i-n+7]=0;
}
}
}
main()
{
memset(lie,0,sizeof(lie));
memset(xie,0,sizeof(xie));
memset(xie1,0,sizeof(xie1));
sum=0;
q(0);
printf("总共有%d种放法",sum);
}
热心网友
时间:2024-10-08 10:32
gdgzzch.blog.163.com
《n皇后问题》
参考资料:gdgzzch.blog.163.com
求教C语言回溯法写出八皇后问题的92种解
else printf("- ");printf("\n");}printf("\n");}//递归实现全排列,a是数组,iStep是位置的测试点,k是皇后的个数,一般等于8void Settle(int *a,int iStep,int k){int i,j,
用C语言编写八皇后问题
a[row][col]=1; //如果是,将当前位置置为1(摆放一个皇后)if(row==7) //所有的8个皇后都已经摆放好了,输出当前的情况。{ num++;print(a);} else { eightqueen(a,row+1); //在row+1摆放下一个皇后。} a[row][col]=0;} } } //判断同一行列是否有其他的皇后 int up(int a...
用回溯+随机法求解8皇后问题
if(i<8) continue;for(j=0;j<8;j++) cout< cout<<" ";total++;//方案数加1 if(total%5==0) cout< queen[7]++;//第7个皇后右移一列,前7个不动 i=7;//制造机会,如果不成功则回溯 } else { queen[i]=0;//当前皇后回归0列 i--;//回溯到前一行皇后 if(i<0){//回溯到...
求此八皇后C程序的流程图~~急~~要流程图~~
八皇后问题:问题提出:8×8的棋盘上放置8个皇后,在同一横线、竖线、对角线上会产生冲突,求不产生冲突即8个皇后都安全的放置方法。这里改变NCOUNT即可以求出n皇后的n×n棋盘的放置方法 张可彦:kyany@sina.com / include "stdio.h"define NCOUNT 8 int nArray[NCOUNT][NCOUNT];// 判断一个...
8皇后问题
return 1;/*不能攻击到其他皇后,返回 1 */ } void Backtrack(int t,int n,int *x)/*递归回溯求解*/ { int i;if(t>n){ sum++;/*输出一个方案*/ printf("方案%d:",sum);for(i=1;i<=n;i++)printf("(%d,%d) ",i,x[i]);printf("\n");} else for(i=1;i<=n;i++...
回溯法用回溯法解题的一般步骤
首先,八皇后问题是一个经典例子。它要求在8x8的国际象棋棋盘上放置8个皇后,使它们互不攻击。通过定义每个皇后所在的行、列和对角线位置为解空间,我们可以使用回溯法进行搜索。C语言程序中,用数组col跟踪皇后位置,剪枝函数检查是否满足皇后间不攻击的条件。如果满足,继续搜索下一个位置,否则回溯并尝试...
八皇后,回溯法求解(c)
写错了吧:for(j=0;(j=0||j<m)&&(b==0);j++)改为:for(j=0;(j==0||j<m)&&(b==0);j++)for(j=0;(j=0||j<n)&&(b==0);j++)改为:for(j=0;(j==0||j<n)&&(b==0);j++)
递归回溯算法解决八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。注意点:说明:理论上应该创建一个二维数组来表示棋盘,...
回溯法的用回溯法解题的一般步骤
(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。回溯法C语言举例八皇后问题是能用回溯法解决的一个经典问题。八皇后问题是一个古老而著名的问题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的...
谁有八皇后问题的编程过程
下面是笔者用Turbo C实现的八皇后问题的图形程序,能够演示全部的92组解。八皇后问题动态图形的实现,主要应解决以下两个问题。 1.回溯算法的实现 (1)为解决这个问题,我们把棋盘的横坐标定为i,纵坐标定为j,i和j的取值范围是从1到8。当某个皇后占了位置(i,j)时,在这个位置的垂直方向、水平方向和斜线方向都不...