c语言函数回溯 c语言函数如何返回值

C语言中回溯法的问题不能删c语言函数回溯的,你不会出错可能是编译器的问题,要不你重新写一次把a[--i]++删掉试下 。它最后是输出几个后进入死循环 。
else的功能是当if条件不符合时(即r个a[]无法再排下去,一般是a[r-1]=m,a[r-2]=m-1……)
比如m=10,r=3
当输出1 2 10时,它接下来输出的是1 3 4,即a[1]从2到3就是else的a[--i]++(即a[--2]++)执行的 。
当最后时输出c语言函数回溯:8 9 10执行两次a[--i]++(a[--2]++,a[--1]++)这样i=0实现断开while(1)这是很重要的 。
求C语言中的回溯法 , 举一个简单的小例子,说明回溯法的运行过程!求子串位置
int Index(SString S, SString T, int pos) {
// 返回子串T在主串S中第pos个字符之后的位置 。
// 若不存在 , 则函数值为0 。
// 其中,T非空,1≤pos≤StrLength(S) 。
int i = pos;
int j = 1;
while (i = S[0]j = T[0]) {
if (S[i] == T[j]) {// 继续比较后继字符
++i;
++j;
} else {// 指针后退重新开始匹配
i = i-j+2;
j = 1;
}
}
if (jT[0]) return i-T[0];
else return 0;
} // Index
c语言回溯算法if(n==7||a[n+1][i]!=1a[n+1][i+1]!=1a[n+1][i-1]!=1)
这行的代码是判断是否可以放皇后的句子 。如果可以就将所在位置置 1。后面也就是这样做判断的 。这个程序应当有问题,其中try应当是C语言中一个关键字啊,不可以这么用 。
就我的看法:八皇后的问题应当用递归加回溯会都到更好的代码,我写过,不过也快忘了 。
回溯算法,用c语言实现这个算法应该不难,基本和全排列的算法类似,只不过判断条件不是n=1, 而是在判断已经取得的数的和=M为终止条件 。
具体的算法,我给个大概流程吧
int lst[N];//保存选取的数
int index = 0;//lst中最后的一个数的位置
func(W, N)
{
if(N == 0)//遍历完毕 返回
return;
for(i=0 to N)
{
if( W[i][1] != -1 )//判断是否已经读取当前值
{
lst[index++] = W[i][0]//当前值加入到保存数组
W[i][1] = -1;//设置当前值已经读?。豢稍俣?
if(check() == 0)
{
func(W, N-1);//大小不够M,继续往下读
}
else if(check() == 1)
{
print(lst);//和为M,输出
}
lst[--index] = 0;//回溯,寻找下一组解
W[i][1] = 0;
}
}
}
check()
{
if(sum(lst)W)
return -1;
if(sum(lst)W)
return 0;
return 1;
}
求教C语言回溯法写出八皇后问题的92种解(1)全排列
将自然数1~n进行排列,共形成n!中排列方式,叫做全排列 。
例如3的全排列是:1/2/3、1/3/2、2/1/3、2/3/1、3/1/2、3/2/1,共3!=6种 。
(2)8皇后(或者n皇后)
保证8个皇后不能互相攻击,即保证每一横行、每一竖行、每一斜行最多一个皇后 。
我们撇开第三个条件 , 如果每一横行、每一竖行都只有一个皇后 。
将8*8棋盘标上坐标 。我们讨论其中的一种解法:
- - - - - - - Q
- - - Q - - - -
Q - - - - - - -
- - Q - - - - -
- - - - - Q - -
- Q - - - - - -
- - - - - - Q -
- - - - Q - - -
如果用坐标表示就是:(1,8) (2,4) (3,1) (4,3) (5,6) (6,2) (7,7) (8,5)
将横坐标按次序排列 , 纵坐标就是8/4/1/3/6/2/7/5 。这就是1~8的一个全排列 。
我们将1~8的全排列存入输入a[]中(a[0]~a[7]),然后8个皇后的坐标就是(i+1,a[i]),其中i为0~7 。
这样就能保证任意两个不会同一行、同一列了 。
置于斜行,你知道的,两个点之间连线的斜率绝对值为1或者-1即为同一斜行,充要条件是|x1-x2|=|y1-y2|(两个点的坐标为(x1,y1)(x2,y2)) 。我们在输出的时候进行判断,任意两个点如果满足上述等式 , 则判为失败,不输出 。

推荐阅读