标题:一道acm的题目答案 不知道为什么编译器通过不了 ?? 求解答
只看楼主
bin931207
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2013-5-4
结帖率:50%
已结贴  问题点数:10 回复次数:1 
一道acm的题目答案 不知道为什么编译器通过不了 ?? 求解答
你一定很熟悉著名的Hanoi塔游戏,当理解了圆盘数目较多需要的时间太长之后,你可以放弃实际去移动圆盘,但你不应该放弃如下一个有点类似的游戏:设有n根柱子,每根柱子上有一个圆盘,圆盘上有一个正整数,不同圆盘上的数不同。初始时假定柱子按照其上圆盘上数的大小从左向右排列,移动规则是从左向右看,当前一根柱子最下圆盘上数与后一根柱子最上圆盘上数相加的和是一个完全平方数时,前一根柱子上所有圆盘移动到后一根柱子上方。要求你编写程序,输入柱子数目和圆盘上的整数,输出移动的过程和结果。例如,一组输入是:4,1,3,5,6,第一个数4表示有4根柱子,圆盘上的数依次是1,3,5,6。你的程序运行后,可以输出1->3->6, 5, c=2,表示移动是1到3,3到6,因为1+3=4, 3+6=9,而4和9是完全平方数,符合条件的移动只有这两次。移动结果是还有2根柱子上有圆盘,即c=2,有圆盘的一根柱子上圆盘3个,有数1->3->6,有圆盘另一根柱子上圆盘一个,有数5,它其实没有发生移动。程序编写完成后,要求给出你的程序对下列两组输入的结果:
(1)9,1,2,3,4,5,6,7,8,9    (2)10,1,3,5,7,9,11,13,15,17,19  (本题为2010年ACM大赛题目。)
提示:输入:9,1,2,3,4,5,6,7,8,9 输出:1->3->6, 2->7->9,4->5,8,c=4
输入:10,1,3,5,7,9,11,13,15,17,19 输出:1->3->13, 5->11,7->9,15,17->19,c=5

#include <stdio.h>
#include <math.h>
void move(int a[])
 {    int i,j,b,c=0,m;
    double t;   
    bool flag[100];   
    for(i=1;i<a[0];i++)   
        flag[i]=false;   
    for(i=1;i<a[0];i++)
    {        if(flag[i])continue;   
    flag[i]=true;   
    b=i;   
    c++;        
    printf("%d",a[i]);   
    for(j=i+1;j<a[0];j++)   
    {        
        if(flag[j])continue;        
        m=a[b]+a[j];        
        t=sqrt(m);        
        if(t==(int)t){        
            printf("->%d",a[j]);        
            flag[j]=true;        
            b=j;        
    }   
    }   
    printf(",");
    }   
    printf("c=%d\n",c);}
int main()
 {    int i=0,a[100];    while(1)
    {        while(scanf("%d,",&a[i++])!=EOF);        move(a);        i=0;    }
 return 0;}
搜索更多相关主题的帖子: 编写程序 柱子 编译器 正整数 
2013-05-05 15:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:10 
bool是C99的罢

#include <stdio.h>
#include <math.h>
#include <stdbool.h>

void move(int a[])
{    int i,j,b,c=0,m;
    double t;   
    bool flag[100];   
    for(i=1;i<a[0];i++)   
        flag[i]=false;   
    for(i=1;i<a[0];i++)
    {        if(flag[i])continue;   
    flag[i]=true;   
    b=i;   
    c++;        
    printf("%d",a[i]);   
    for(j=i+1;j<a[0];j++)   
    {        
        if(flag[j])continue;        
        m=a[b]+a[j];        
        t=sqrt(m);        
        if(t==(int)t){        
            printf("->%d",a[j]);        
            flag[j]=true;        
            b=j;        
    }   
    }   
    printf(",");
    }   
    printf("c=%d\n",c);}
int main()
{    int i=0,a[100];    while(1)
    {        while(scanf("%d,",&a[i++])!=EOF);        move(a);        i=0;    }
return 0;}

-*- mode: compilation; default-directory: "z:/" -*-
Compilation started at Sun May  5 21:56:11

gcc -Wall a.c -std=c99

Compilation finished at Sun May  5 21:56:11

加C99的头文件 用支持C99标准的gcc 编译通过

2013-05-05 21:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-406249-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.297320 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved