题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1015

因为之前看了下刘汝佳的《算法入门经典》,就用类似打印全排列,八皇后的方法做。本以为不难,结果却被两个细节搞了很久。1.在递归函数的出口没有把sum设为原来的值,结果导致当不符合条件时sum一直加下去。 2.pow() 函数的返回值是浮点型,而我一开始将sum和tg定为int类型,导致比较是否相等时出现了误差(其实自己不太清楚这方面的东西)

下面是代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
double tg;
int len;
char a[20],b[20];//a存输入的字母,从0开始存。 b存目标字母,从1开始。 int cmp(const void*a, const void*b)
{
return *(char*)b-*(char*)a;
} int solve(double sum,int n)
{
if(n==6)
{
if(sum==tg)
return 1;
else
return 0;
} for(int i = 0;i<len; i++)
{
int j;
for(j = 1;j<n;j++)//寻找是否与已存的字母重复
if(a[i]==b[j]) break; if(j==n)//若不重复,则存入现在的b[n]中
{
double sum1 = sum;//记录原先的sum值,若不符合条件,则将其值还原
b[n] = a[i];
if(n%2)
sum += pow(b[n]-64,n);
else
sum -= pow(b[n]-64,n);
if(solve(sum,n+1))
return 1;
sum = sum1;//在递归的出口将sum还原为之前的值,这样才不会妨碍下一个字母的操作
}
}
return 0;
} int main()
{
while(scanf("%lf %s",&tg,a)==2 && (tg || strcmp(a,"END")))
{
len = strlen(a);
qsort(a,len,sizeof(a[0]),cmp);//将输入的字母排序,以便最大字典序输出
if(solve(0,1))
puts(b+1);//由于b从1开始存,所以输入的地址要加一个单位
else
puts("no solution");
}
return 0;
}

最新文章

  1. Android 几种消息推送方案总结
  2. 动态获取div的高度 随着窗口变化而变化
  3. 学习 HTML5-页面结构(1)
  4. [LeetCode] Remove Duplicates from Sorted Array
  5. ZooKeeper系列1:ZooKeeper的配置
  6. redis_查找命令
  7. apacheserver下载、安装、配置
  8. [GRYZ2014]迷宫问题
  9. javaweb 登录注册
  10. 初探ExtJS(2)
  11. CentOS 7 上面安装PowerShell
  12. cpp(第四章)
  13. Java入门——(3)面对对象(下)
  14. 201521123039《java程序设计》第十四周学习总结
  15. 安卓电量优化之JobScheduler使用介绍
  16. Java课程课后作业之19学期之第一周博客作业
  17. JSR107缓存规范
  18. 一步步教你上架iOS APP
  19. hibernate ID
  20. java post请求的表单提交和json提交简单小结

热门文章

  1. 2017.2.12 开涛shiro教程-第八章-拦截器机制
  2. linux中ps命令的用法说明
  3. nginx如何设置防盗链
  4. iOS - 贝塞尔曲线,折线,曲线,波浪线
  5. 学习使用用Eclipse编写java程序
  6. rtmp 错误 Server error: call to function _checkbw failed
  7. 2014acm亚洲区域赛陕西赛总结
  8. Qt4.8.5配置相关问题
  9. android 怎样加速./mk snod打包
  10. matlab中文显示乱码:控制台上的,编辑器的,图片中的