数据结构的编程 错误太多了……大家帮忙改改吧 谢谢啦

晓私 2011-06-09 11:36:32
在火车货场车皮编解场,2条轨道连接到2条侧轨道,形成2个铁路转轨栈,其中左边轨道为车皮入口,编号为A;右边轨道为出口,编号为D;2个铁路转轨栈分别编号为C和D如下图所示。编号为a, b, c, ┅, n的各车皮依序停放在车皮的入口处,调度室要安排个车皮进出栈次序,使得在出口处各车皮按照预先制定的顺序依次出站。车皮移动时只能按照从左到右的方向移动。

实现要求:
对于给定的车皮数n,以及各车皮的出站顺序,编程计算最优调度方案,使得移动车皮的次数最少。
数据输入:由文件input.txt给出数据。第一行有1个正整数n,表示车皮数;接下来的1行是一个字符串,表示预先确定的车皮的出站顺序。
数据输出:将计算得到的最优调度方案输出到文件output.txt,文件的第一行使最少移动次数m,接下来的m行使对于最优方案的m次移动。每次移动用“cXY”的3个字符表示,其中c表示车皮编号,X表示其时栈号,Y表示目标栈号。如果无法调度则输出“No Solution!”


#include <stdio.h>
#include <stdlib.h>
#define LEN 16384
typedef char Data;
typedef struct Stack
{
Data *data;
Data *end;
}Stack;
Stack A,B,C,D;
int total;
Data head;
Data end;
Data a,b,c;
int ns;
unsigned long min = 0x7FFFFFFF, count;
char res[LEN], tmp[LEN], *p = tmp;
#define EOD (127)

void Init ( Stack *a, int len )
{
a->data = (Data*) malloc ( len * sizeof(Data) );
memset ( a->data, 0, len * sizeof(Data) );
a->end = a->data - 1;
}
void ReadData ( void )
{
int i;
FILE *fp;
fp = fopen ( "input.txt", "r" );
if ( fp == NULL )
exit ( __COUNTER__ );

fscanf ( fp, "%d", &total );
if ( total < 1 )
{
fclose ( fp );
exit ( __COUNTER__ );
}

Init ( &A, total+1 );
Init ( &B, total+1 );
Init ( &C, total );
Init ( &D, total+1 );
fscanf ( fp, "%s", A.data );
end = head = A.data[0];
for ( i = 1; A.data[i] != 0; i++ )
{
if ( head > A.data[i] ) head = A.data[i];
if ( end < A.data[i] ) end = A.data[i];
}
A.end = A.data + i - 1;
ns = 1;
a = b = c = EOD;
end++;
fclose ( fp );
}

void End ( void )
{
FILE *fp;
free ( A.data );
free ( B.data );
free ( C.data );
free ( D.data );
fp = fopen ( "output.txt", "w" );
if ( fp == NULL )
{
fclose ( fp );
exit ( __COUNTER__ );
}
if ( min == 0x7FFFFFFF )
sprintf ( tmp, "No Solution!\n" );
else
sprintf ( tmp, "%d\n%s", min, res );
fprintf ( fp, "%s", tmp );
fprintf ( stdout, "%s", tmp );
fclose ( fp );
}

void Show ( Stack a, char *s )
{
char *tmp, *pc;
char *p = (char*)a.data;
pc = tmp = (char*) malloc ( total + 1 );
while ( p <= a.end )
*pc++ = *p++;
*pc = 0;
printf ( "%s%s", tmp, s );
}

void Calc ( Data d )
{
if ( p > tmp + LEN )
{
fprintf ( stdout, "!!\n" );
return;
}
printf ( "===================================\nA: " );
Show ( A, "\tB: " );
Show ( B, "\tC: " );
Show ( C, "\tD: " );
Show ( D, "\n" );
if ( d == end )
{
if ( min > count )
{
min = count;
strcpy ( res, tmp );
return;
}
}
count++;
if ( A.end >= A.data )
a = *A.end;
else
a = EOD;
if ( B.end >= B.data )
b = *B.end;
else
b = EOD;
if ( C.end >= C.data )
c = *C.end;
else
c = EOD;
if ( a == d )
{
*++D.end = a;
A.end--;
p += sprintf ( p, "%cAD\n", a );
Calc ( d + 1 );
p -= 4;
count--;
D.end--;
A.end++;
return;
}
if ( b == d )
{
*++D.end = b;
B.end--;
p += sprintf ( p, "%cBD\n", b );
Calc ( d + 1 );
p -= 4;
count--;
D.end--;
B.end++;
return;
}
if ( c == d )
{
*++D.end = c;
C.end--;
p += sprintf ( p, "%cCD\n", c );
Calc ( d + 1 );
p -= 4;
count--;
C.end++;
D.end--;
return;
}
if ( a != EOD )
{
Data tmpA = a;
*++B.end = a;
A.end--;
p += sprintf ( p, "%cAB\n", a );
Calc ( d );
p -= 4;
B.end--;
a = tmpA;
*++C.end = a;
p += sprintf ( p, "%cAC\n", a );
Calc ( d );
p -= 4;
C.end--;
A.end++;
}
if ( b != EOD )
{
*++C.end = b;
B.end--;
p += sprintf ( p, "%cBC\n", b );
Calc ( d );
p -= 4;
C.end--;
B.end++;
}
count--;
}

void main ( void )
{
ReadData();
Calc( head );
End();
}
...全文
75 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
晓私 2011-06-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#define LEN 16384
typedef char Data;
typedef struct Stack
{
Data *data;
Data *end;
到这就有错误……
ouyh12345 2011-06-09
  • 打赏
  • 举报
回复
编译错误?贴出错误行和错误信息
结果不对?逻辑是否正确、单步跟踪了吗?
chenjelly 2011-06-09
  • 打赏
  • 举报
回复


自己单步调试
dfasri 2011-06-09
  • 打赏
  • 举报
回复
连题目都看不明白...

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧