问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c一段代码...八皇后问题中的...

发布网友 发布时间:2022-04-26 04:50

我来回答

1个回答

热心网友 时间:2022-04-26 06:19

这个函数的作用是通过递归按顺序设置x所指数组的元素值,k记录当前的数组长度。
执行过程分析,当k=1时,即第一次调用solve1函数,由于j<k-1总是假,内部的for循环一次也没有
被执行,所以f=0,因此会暂时停止进一步执行外部for循环,全局数组a下标0的位置被设置为1。之后将x
和k值加1作为参数递归调用自身,x+1意味着再次进入solve1函数时a数组下标1位置的值会被设置,k+1
意味着数组中将会存入额外的一个元素。
第二次调用solve1函数时,k=2,x=&a[1],由于k-1=1,i的每一个值都会导致内部的for循环被执行一次,
因为a[0]==1,f被置为1,所以i等于1时的值不会存放在a[1]中。当i=2时,内部的第二个if判断为真,
i的值不会被存在a[1]中,继续执行外部的下一次for循环。此时i=3,内部的两个if为假,i的值
会被存放在a[1]中,暂时挂起外部for循环,继续调用自身。
第三次执行solve1函数时, k=3, x=&a[2], 由于k-1=2,i的每一个值都会执行内部的循环两次,
由于i=1、2、3,4时满足内部的if条件,会执行外部for的下一次循环,当i=5时,内部if不成立,
i的值会被存放在a[2]中。。。其实递归调用的执行过程只可意会不可言传。
总体上来说,solve1函数让a全局数组的每个元素通过一定的规则从1-8这8个数中选取合适的值。
如果懂得运用,这样的递归算法可以产生任何字母数字任意长度的排列,所以说非常有用,理解不了也
应该背下来。

可以把solve1函数分解成这样。
#include <stdio.h>
#include <math.h>

int a[8];

void main()
{
int i, j, k, l, m, n, o, p, x, y = 1, f, LOOP;
int *current = a;

for (i = 1; i < 9; ++i)
{
f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == i) f=1;
if (abs(a[x] - i) == y - x - 1) f=1;
}

if (f) continue;
*current++ = i;
y++;
for (j = 1; j < 9; ++j)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == j) f=1;
if (abs(a[x] - j) == y - x - 1) f=1;
}

if (f) continue;
*current++ = j;
y++;
for (k = 1; k < 9; ++k)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == k) f=1;
if (abs(a[x] - k) == y - x - 1) f=1;
}

if (f) continue;
*current++ = k;
y++;
for (l = 1; l < 9; ++l)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == l) f=1;
if (abs(a[x] - l) == y - x - 1) f=1;
}

if (f) continue;
*current++ = l;

y++;
for (m = 1; m < 9; ++m)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == m) f=1;
if (abs(a[x] - m) == y - x - 1) f=1;
}

if (f) continue;

*current++ = m;

y++;
for (n = 1; n < 9; ++n)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == n) f=1;
if (abs(a[x] - n) == y - x - 1) f=1;
}

if (f) continue;

*current++ = n;

y++;
for (o = 1; o < 9; ++o)
{

f=0;

for (x=0;x<y-1;x++)
{
if (a[x] == o) f=1;
if (abs(a[x] - o) == y - x - 1) f=1;
}

if (f) continue;

*current++ = o;

y++;
for (p = 1; p < 9; ++p)
{

f=0;

for (x = 0; x < y-1; x++)
{
if (a[x] == p) f=1;
if (abs(a[x] - p) == y - x - 1) f=1;
}

if (f) continue;

*current = p;

for (LOOP = 0; LOOP < 8; ++LOOP)
printf("%d ", a[LOOP]);

putchar('\n');

}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
y--;
current--;
}
current--;
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
招商银行的美元天添金怎么样? 天添美蒸馒头为什么开裂呢 上海食堂送菜 邮政跨地区取款手续费多? 谁能告诉我邮政储蓄卡跨省取钱要不要收费啊? 自贡市龙盛世纪仿真模型制造有限公司公司简介 学PS真的很难吗 红烧萝卜牛筋 微信怎么转发公众号部分内容 转发公众号部分内容方法 微信公众号内的视频如何下载?一个F12搞定 各位大侠:ppt 插入附件2007版ppt 插入EXCEL附件,放映模式下打开的问题,还请指教!问题补充: 八皇后c++源码讲解 比心陪练app经常这样!滑不下去!怎么办!求解答! 厚街旅游景点 文胸34码穿多大的 聊天记录可以转到另一个上吗? 一个程序:用递归算法(回溯法)做八皇后问题? 微信聊天记录能迁移到另一个吗? 自己别人登录聊天记录怎么传过去距离远能传么 临时身份证丢失可以补办吗 一旦身份证丢了,被人捡去,我办了临时身份证就没事了吧? 临时身份证丢了严重吗 身份证丢了 临时身份证掉了怎么办 临时身份证丢了严重吗,怎么办? 临时身份证丢失,后果严重吗? 临时身份证丢了严重吗,身份证已经办好了 临时身份证丢了会有什么影响吗 临时身份证掉了严不严重 jm蜂蜜面膜怎么一股 奥迪a4与a3区别 奥迪a3a4有什么区别 微信密码是对的,为什么修改需要输入密码时,一直提示账号或密码错误? 微信密码是对的,为什么修改需要输入密码时,一直提示账号或密码错误?_百度问一问 穿越诸天类小说,是从电影金刚开始的,主要以辰东的小说为主题材(遮天 长生界神墓 完美世界飞升之后) 长生界的作品简介 谁能帮咱介绍几本小说<玄幻比如长生界·神墓·仙逆·这类的小说>拜托了 关于小说长生界的问题。 求穿越过长生界的小说 一本小说主角穿越到一个世界,神墓是东方世界,长生界是西方世界的小说 求一本小说名,诸天流还是无限流的,一个情节是主角和几个人到一个世界,收了几个徒弟 约定几十年后比武 win10注销账号后变成管理员了 要把电脑上的声音传输到电视机上,是不是有这么一根连接线的? 在过滤桶放出来的水为什么会有蟑螂的味道? 家里蟑螂多得要命啊!~~~再不解决我要去“史”啊! 八皇后,回溯法求解(c) 开机电脑长亮不能开机? 为什么我的电脑开不开机了,插头都插好了 显示屏也一直在亮,但是主机就是一直没反应 华硕笔记本电脑灯泡状的指示灯亮着,但是按电源键开不了机,屏幕一直黑着怎么办? 关于八皇后问题,急需!