各位帮个忙吧 编的数据结构的程序错误太多 帮忙改改吧 谢谢啦

来源:互联网 发布:传奇霸业宝石升级数据 编辑:程序博客网 时间:2024/06/06 09:24
在火车货场车皮编解场,2条轨道连接到2条侧轨道,形成2个铁路转轨栈,其中左边轨道为车皮入口,编号为A;右边轨道为出口,编号为D2个铁路转轨栈分别编号为CD如下图所示。编号为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();

}