您的位置:首页 > 编程语言 > C语言/C++

第六届蓝桥杯C/C++A组第五题解答

2015-05-14 15:39 211 查看
题目:

1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?

下面的程序实现了该功能,请填写划线部分缺失的代码。

#include <stdio.h>
void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];

if(a*3==b) printf("%d / %d\n", a, b);
}
void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}
for(i=k; i<9; i++){
{t=x[k]; x[k]=x[i]; x[i]=t;}
f(x,k+1);
_____________________________________________ // 填空处
}
}
int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}

思路:

简要的看了题目后,我们 不难看出题目中给出的f是一个想要实现回溯功能的函数,test是一个判断结果的函数,那么,我们看看f内的细节,首先f包含两个参数,x[]和k,一个是负责把数组x传入,一个是记录现在进行到第几个数了,如果k>=9那么已经遍历结束,进行结果检测,然后返回,而那个for循环的作用就是把数从第k个进行良良交换来达到每个数都试到的目的,然后就是继续调用函数f,函数调用结束后要进行回溯归位,就把上面那一行的代码复制即可。

代码:

#include <stdio.h>
void test(int x[])
{
int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];

if(a*3==b) printf("%d / %d\n", a, b);
}
void f(int x[], int k)
{
int i,t;
if(k>=9){
test(x);
return;
}
for(i=k; i<9; i++){
{t=x[k]; x[k]=x[i]; x[i]=t;}
f(x,k+1);
{t=x[k], x[k]=x[i], x[i]=t;}
}
}
int main()
{
int x[] = {1,2,3,4,5,6,7,8,9};
f(x,0);
return 0;
}

运行结果:

心路历程:

其实做这道题的时候,没有很用心,就是想到要回溯归位,尝试着把上面的代码复制一遍,然后居然出结果了,那个高兴啊,考完后,上贴吧,发现好多人都在说有关这道题复合语句的问题,就是复合语句中不要打“;”要打“,”,当时 心头一紧,我没考虑到复合语句,直接把上面的”t=x[k]; x[k]=x[i]; x[i]=t;“复制到下面来了,然后符号也没改,当时心里想着药丸药丸,这nm太考细节了吧,后来再仔细想想觉得也没什么,只要对了能出结果就行了,当然这也给我敲了一个警钟,不要忽视细节。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: