回溯法做八皇后 哪里不对呢??

lyk314949530 2017-02-19 12:15:40
[
#include<stdio.h>

#define MaxSize 2000

void InitBoard(int *a,int n)
{
int i;
for(i=0;i<n;i++)
{
a[i]=0;//初始化棋盘,将每行置于第一列
}
}
int conflict(int *a,int n)
{
int i;
int flag = 0;
for(i=0;i<n;i++) //查看第n
{
if((a[i]==a[n])||(a[i]-a[n]==i-n)||(a[i]-a[n]==n-i))//不在一列 不在同一对角线
{
flag = 1;
}
}
return flag;
}

int Queen(int n)
{
int count = 0;
int a[MaxSize];
InitBoard(a,n);
int i=0;

while(1)
{
if(a[i]<n)//该行未超出棋盘范围
{
if(conflict(a,i))//有冲突
{
a[i]++;//查看下一个节点
continue;
}
if(i>n-1)//到达最后一行,查看最后一行成功遍历的个数
{
count++;//成功数
a[n-1]++;//查看最后一行其他点是否可行
continue;
}

i++;//没有冲突 进入下一行
continue;
}

else //该行已经超出范围
{
a[i] = 0;//先将这一行复位
i--;
if(i<0)//已经不能退了 说明遍历结束
{
return count;
}
a[i]++;
continue;
}
}


}

int main()
{
int n;
scanf("%d",&n);

int resault = Queen(n);
printf("%d",resault);
return 0;

}


...全文
138 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灸舞 版主 2017-02-20
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
ck2333 2017-02-19
  • 打赏
  • 举报
回复
#include <stdio.h>

int left[15]={0},right[15]={0},col[8]={0};
int q[8],top=-1;
int cnt=0;

void print()  //按顺序输出 
{
	int i,j;
	printf("这是第%d个解:\n",++cnt);
	for(i=0;i<8;i++)
	{
		for(j=0;j<8;j++)
		{
			if(q[i]==j)
				printf("Q ");
			else printf("X ");
		}
		printf("\n");
	}
}

void EightQueue ()
{
	int i=0,j=0;
	top=-1;
	while(i<8)  //从第一层开始 
	{
		while(j<8)  //从第一列开始 
		{
			if(col[j]==0&&left[i+j]==0&&right[i+7-j]==0)  //如果满足条件,则跳出循环 
				break;
			j++;
		}
		if(j<8)  //如果跳出循环后j是在0~7,则放皇后 
		{
			q[++top]=j;
			left[i+j]=1;
			right[i+7-j]=1;
			col[j]=1;
			if(i<7)  //如果放的层数在0~7,则说明还没放完 
			{
				i++;
				j=0;
			}
			else  //8层全部放满了,输出棋盘 
			{
				print();
				printf("\n");
				if(top!=-1)  //如果这个时候栈非空,则回到栈顶皇后,并将其抹去 
				{
					i=top;
					j=q[top--];
					left[i+j]=col[j]=right[i+7-j]=0;
					j++;
				}
			}
		}
		else  //如果在0~7中没找到合适的位置放皇后,则回到栈顶皇后,并将其抹去(栈不为空) 
		{
			if(top!=-1)
			{
				i=top;
				j=q[top--];
				left[i+j]=col[j]=right[i+7-j]=0;
				j++;
			}
		}
		if(i==-1) //当第一层的位置都已经使用过,则会使i跳到下面一层,即皇后的放法已经全部找出  
			break;
	}
}


int main (void)
{
	EightQueue();
	return 0;
}

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧