各位帮个忙吧 编的数据结构的程序错误太多 帮忙改改吧 谢谢啦
来源:互联网 发布:传奇霸业宝石升级数据 编辑:程序博客网 时间:2024/06/06 09:24
在火车货场车皮编解场,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();
}
- 各位帮个忙吧 编的数据结构的程序错误太多 帮忙改改吧 谢谢啦
- 一个简单的钟表程序,请帮忙改改
- 各位帮忙看一下这个求100!的小程序哪里错啦?
- 请各位大侠帮忙看看我编的程序可行吗,
- 用c语言编的题 帮我改改吧
- 不明白的错误!各位帮忙一下!谢了!
- 为什么C++里所有类型的变量都一整型输出???请高手帮忙, 谢谢啦!!!!
- 求大神帮忙解决一个网络设备互联的考试题,谢谢啦。
- 各位C#高手,我编了个小小关于TreeView控件的程序但就是在窗口上显示不出来.帮忙解决下.
- 有点小错误,麻烦帮忙改改啊
- 帮学院里一个10级童鞋宣传的一个社会调查——“我与计算机专业” 走过路过的帮忙下吧。。。~先谢谢啦~
- 求助高手,帮忙编一个只用加法和单循环,计算出不超过n的三次方根的整数的算法。谢谢!!
- [VB.NET]将VB中文档写入Word时出现的错误,帮忙解决一下,谢谢
- 学期末实验报告急着交,请各位帮忙!是有关数据结构的!
- hidden的问题,各位高手,帮忙啊!!!
- 想收集一下名人名言。谢谢各位啦
- 谁能帮我写下这个程序的流程图啊`````急用`````望高手多多帮忙谢谢!
- 那位朋友帮忙给我写一下C语言的程序.谢谢了.. 大家好
- Update delay .
- Mount Windows (CIFS) LAN Shares and Overcome Libreoffice/.doc Issues
- c和c++整合的优势
- 关于函数式编程的几个词
- 采用四缓冲提高自绘界面的效率
- 各位帮个忙吧 编的数据结构的程序错误太多 帮忙改改吧 谢谢啦
- (转)multipart form-data boundary 说明
- ORACLE单行函数与组函数详解
- 鲜为人知内幕:中国战机发动机急速发展之迷
- ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二)
- 用MDK+ULINK烧写HEX文件或者AXF文件的说明(完整)
- How to use # inside a macro definition - 宏定义嵌套问题
- 要下载的时候才知道郁闷!
- ReactOS-Freeldr镜像加载3