c语言回溯法难吗,整数变换问题(C语言)--回溯法

整数变换问题

题目描述

关于整数i的变换f和g定义如下:f(i)=3i;g(i)=i/2。

现要求对于给定的2个整数n和m,用最少的f和g变换次数将n变换为m。

具体代码实现

#include

#define MAX 100

#define MAXVALUE 32767

int m,n;

int a[MAX]={0};//记录变换数组

int b[MAX];//记录最少变换数组

int mincount=MAXVALUE;//记录最少变换次数

int tempcount=0;//记录交换次数

//向文件读入一个字符

void fileWriteChar(char c){

FILE *fp;

fp = fopen("i:\\算法\\回溯法\\output.txt", "a");

if (fp == NULL) {//若打开文件失败则退出

printf("不能打开文件!\n");

return ;

}

fprintf(fp,"%c",c);

fclose(fp);

}

//向文件读入一个数字

void fileWriteInt(int i){

FILE *fp;

fp = fopen("i:\\算法\\回溯法\\output.txt", "a");

if (fp == NULL) {//若打开文件失败则退出

printf("不能打开文件!\n");

return ;

}

fprintf(fp,"%d\n",i);

fclose(fp);

}

//从文件读取m,n

void fileRead(){

FILE *fp;

fp = fopen("i:\\算法\\回溯法\\input.txt", "r");

if (fp == NULL) {//若打开文件失败则退出

printf("不能打开文件!\n");

return ;

}

//从文件中读入m,n

fscanf(fp,"%d",&m);

fscanf(fp,"%d",&n);

fclose(fp);

}

void traceback(int t)

{

if(t==n)

{

if(tempcount

{

mincount=tempcount;

for(int i=1;i<=mincount;i++)

{

b[i]=a[i];

}

}

return;

}

else{

tempcount++;

if(tempcountn)

{

a[tempcount]=2;

traceback(t/2);

}

tempcount--;

tempcount++;

if(tempcount0 && t

{

a[tempcount]=1;

traceback(t*3);

}

tempcount--;

}

}

int main(){

fileRead();

traceback(m);

fileWriteInt(mincount);//最少变换次数

for(int i=mincount;i>0;i--){

if(a[i]==2)

fileWriteChar('g');

else

fileWriteChar('f');

}

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值