停车场以及迷宫问题
停车场以及迷宫问题求助!<BR>请个位大侠帮帮忙,说一下思路以及结构体的写法! [em04]<BR>先谢谢了! 停车场管理:<BR>[问题描述]<BR> 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出;汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停滞n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入:当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用.试为停车场编制按上述要求进行管理的模拟程序.<BR>[基本要求]<BR> 以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理.每一组输入数据包括三个数据项:汽车"到达"或"离去"信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间及应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链式结构实现。<BR> <P>#include<stdio.h><BR>#include<stdlib.h><BR>#include<string.h><BR>/*----------------------结构定义--------------------------------*/<BR>#define MAX 2 /*车库容量*/<BR>#define price 0.05 /*每车每分钟费用*/<BR>typedef struct time{<BR>int hour;<BR>int min;<BR>}Time; /*时间结点*/<BR>typedef struct node{<BR>char num[10];<BR>Time reach;<BR>Time leave;<BR>}CarNode; /*车辆信息结点*/<BR>typedef struct NODE{<BR>CarNode *stack[MAX+1];<BR>int top;<BR>}SeqStackCar; /*模拟车站*/<BR>typedef struct car{<BR>CarNode *data;<BR>struct car *next;<BR>}QueueNode;<BR>typedef struct Node{<BR>QueueNode *head;<BR>QueueNode *rear;<BR>}LinkQueueCar; /*模拟通道*/<BR>/*-------------------初始化函数----------------------------------*/<BR>void InitStack(SeqStackCar *); /*初始化栈*/<BR>int InitQueue(LinkQueueCar *); /*初始化便道*/<BR>int Arrival(SeqStackCar *,LinkQueueCar *); /*车辆到达*/<BR>void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /*车辆离开*/<BR>void List(SeqStackCar,LinkQueueCar); /*显示存车信息*/<BR>/*----------------------子函数-------------------------------------*/<BR>void main()<BR>{<BR>SeqStackCar Enter,Temp;<BR>LinkQueueCar Wait;<BR>int ch;<BR>InitStack(&Enter); /*初始化车站*/<BR>InitStack(&Temp); /*初始化让路的临时栈*/<BR>InitQueue(&Wait); /*初始化通道*/<BR>while(1)<BR>{<BR>printf("\n1. The car arrived:");<BR>printf(" 2. The car leave:");<BR>printf(" 3. Show the list:");<BR>printf(" 4. Exit the OS:\n");<BR>while(1)<BR>{<BR>scanf("%d",&ch);<BR>if(ch>=1&&ch<=4)break;<BR>else printf("\nPlease chose: 1|2|3|4.");<BR>}<BR>switch(ch)<BR>{<BR>case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/<BR>case 2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/<BR>case 3:List(Enter,Wait);break; /*列表打印信息*/<BR>case 4:exit(0); /*退出主程序*/<BR>default: break;<BR>}<BR>}<BR>}<BR>/*----------------出站车函数----------------------------------------*/<BR>void InitStack(SeqStackCar *s) /*初始化栈*/<BR>{<BR>int i;<BR>s->top=0;<BR>for(i=0;i<=MAX;i++)<BR>s->stack[s->top]=NULL;<BR>}<BR>int InitQueue(LinkQueueCar *Q) /*初始化便道*/<BR>{<BR>Q->head=(QueueNode *)malloc(sizeof(QueueNode));<BR>if(Q->head!=NULL)<BR>{<BR>Q->head->next=NULL;<BR>Q->rear=Q->head;<BR>return(1);<BR>}<BR>else return(-1);<BR>}<BR>void PRINT(CarNode *p,int room) /*打印出站车的信息*/<BR>{<BR>int A1,A2,B1,B2;<BR>printf("\nInput the left time:/**:**/");<BR>scanf("%d:%d",&(p->leave.hour),&(p->leave.min));<BR>printf("\nNo.of the left car:");<BR>puts(p->num);<BR>printf("\nArrival time: %d:%d",p->reach.hour,p->reach.min);<BR>printf("Left time: %d:%d",p->leave.hour,p->leave.min);<BR>A1=p->reach.hour;<BR>A2=p->reach.min;<BR>B1=p->leave.hour;<BR>B2=p->leave.min;<BR>printf("\nCharge: %2.1f元",((B1-A1)*60+(B2-A2))*price);<BR>free(p);<BR>}<BR>int Arrival(SeqStackCar *Enter,LinkQueueCar *W) /*车辆到达*/<BR>{<BR>CarNode *p;<BR>QueueNode *t;<BR>p=(CarNode *)malloc(sizeof(CarNode));<BR>flushall();<BR>printf("\nInput car number(eg:SHANA1234):");<BR>gets(p->num);<BR>if(Enter->top<MAX) /*车场未满,车进车场*/<BR>{<BR>Enter->top++;<BR>printf("\nThe car's position is %d/n.",Enter->top);<BR>printf("\nInput arrival time:/**:**/");<BR>scanf("%d:%d",&(p->reach.hour),&(p->reach.min));<BR>Enter->stack[Enter->top]=p;<BR>return(1);<BR>}<BR>else /*车场已满,车进便道*/<BR>{<BR>printf("\nMust wait at sidewalk!");<BR>t=(QueueNode *)malloc(sizeof(QueueNode));<BR>t->data=p;<BR>t->next=NULL;<BR>W->rear->next=t;<BR>W->rear=t;<BR>return(1);<BR>}<BR>}<BR>void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)<BR>{ /*车辆离开*/<BR>int i, room;<BR>CarNode *p,*t;<BR>QueueNode *q;<BR>/*判断车场内是否有车*/<BR>if(Enter->top>0) /*有车*/<BR>{<BR>while(1) /*输入离开车辆的信息*/<BR>{<BR>printf("\nInput the position of this car:/1--%d/:",Enter->top);<BR>scanf("%d",&room);<BR>if(room>=1&&room<=Enter->top) break;<BR>}<BR>while(Enter->top>room) /*车辆离开*/<BR>{<BR>Temp->top++;<BR>Temp->stack[Temp->top]=Enter->stack[Enter->top];<BR>Enter->stack[Enter->top]=NULL;<BR>Enter->top--;<BR>}<BR>p=Enter->stack[Enter->top];<BR>Enter->stack[Enter->top]=NULL;<BR>Enter->top--;<BR>while(Temp->top>=1)<BR>{<BR>Enter->top++;<BR>Enter->stack[Enter->top]=Temp->stack[Temp->top];<BR>Temp->stack[Temp->top]=NULL;<BR>Temp->top--;<BR>}<BR>PRINT(p,room);<BR>/*判断通道上是否有车及车站是否已满*/<BR>if((W->head!=W->rear)&&Enter->top<MAX) /*便道的车辆进入车场*/<BR>{<BR>q=W->head->next;<BR>t=q->data;<BR>Enter->top++;<BR>printf("\n%scar in sidewalk enter the parkseat%d.",t->num,Enter->top);<BR>printf("\nInput now time/**:**/:");<BR>scanf("%d:%d",&(t->reach.hour),&(t->reach.min));<BR>W->head->next=q->next;<BR>if(q==W->rear) W->rear=W->head;<BR>Enter->stack[Enter->top]=t;<BR>free(q);<BR>}<BR>else printf("\nNo car at sidewalk.\n"); <BR>}<BR>else printf("\nNo car in the park."); /*没车*/<BR>}<BR>void List1(SeqStackCar *S) /*列表显示车场信息*/<BR>{<BR>int i;<BR>if(S->top>0) /*判断车站内是否有车*/<BR>{<BR>printf("\nPark:");<BR>printf("\n Position Arrivaltime CarNo.\n");<BR>for(i=1;i<=S->top;i++)<BR>{<BR>printf(" %d ",i);<BR>printf("%d:%d ",S->stack->reach.hour,S->stack->reach.min);<BR>puts(S->stack->num);<BR>}<BR>}<BR>else printf("\nNo car in the park");<BR>}<BR>void List2(LinkQueueCar *W) /*列表显示便道信息*/<BR>{<BR>QueueNode *p;<BR>p=W->head->next;<BR>if(W->head!=W->rear) /*判断通道上是否有车*/<BR>{<BR>printf("\nWaiting car number:");<BR>while(p!=NULL)<BR>{<BR>puts(p->data->num);<BR>p=p->next;<BR>}<BR>}<BR>else printf("\nNo car at the sidewalk.");<BR>}<BR>void List(SeqStackCar S,LinkQueueCar W)<BR>{<BR>int flag,tag;<BR>flag=1;<BR>while(flag)<BR>{<BR>printf("\nChose 1|2|3:");<BR>printf("\n1.Park\n2.Sidewalk\n3.Back\n");<BR>while(1)<BR>{<BR>scanf("%d",&tag);<BR>if(tag>=1||tag<=3) break;<BR>else printf("\nChose 1|2|3:");<BR>}<BR>switch(tag)<BR>{<BR>case 1:List1(&S);break; /*列表显示车场信息*/<BR>case 2:List2(&W);break; /*列表显示便道信息*/<BR>case 3:flag=0;break;<BR>default: break;<BR>}<BR>}<BR>}</P><P>那么迷宫问题呢?<BR></P> <P>支持啊,我就想要它啊!</P> 顶了,正是我想要的啊! <P>程序是用来演示迷宫走法的,图形模式。<BR>TC下运行。<BR>从文件读入,文件如下:<BR>maze.txt<BR></P>
<DIV class=htmlcode>1 0 0 0 1 1 0 1 1 0<BR>0 1 1 0 0 0 0 1 1 1<BR>1 1 0 1 1 1 1 1 1 0<BR>1 1 0 1 0 0 1 1 1 1<BR>0 0 1 1 0 1 1 0 1 0<BR>0 1 1 1 1 0 0 1 1 1<BR>0 0 1 1 0 1 0 0 1 1<BR>1 1 0 0 0 1 0 0 1 0<BR>0 0 1 1 1 1 0 0 0 1<BR>0 1 0 0 1 1 1 1 0 1</DIV>
<DIV class=htmlcode>
<P>#include "Stdio.h"<BR>#include "Conio.h"<BR>#include "Stack.h"<BR>#include "graphics.h"<BR>#include "dos.h"<BR>#define N 10<BR>/*为迷宫每个点的信息处理重命名*/<BR>typedef struct INFOR<BR>{<BR> int num; /*迷宫的点是可通过(1)还是不可通过(0)*/<BR> int flag; /*迷宫的点是否被走过*/<BR>}info;<BR>/*迷宫点的坐标和判断节点是否可行*/<BR>typedef struct MAZE<BR>{<BR> cod point;<BR> int tag;<BR>}maze;</P>
<P>maze search(info a[][N+2],int x,int y);<BR>void draw_maze(info a[][N+2]);<BR>void draw_way(int way[][2],int i);</P>
<P>int main(void)<BR>{<BR> list_stack *s=NULL;<BR> info arr[N+2][N+2];<BR> FILE *fp;<BR> int i,j;<BR> int way[100][2]={0};<BR> int gdriver=DETECT,gmode;<BR> cod cur;<BR> /*初始化链栈*/<BR> InitialStack(s);<BR> /*从文件中读取数据*/<BR> fp=fopen("MAZE.TXT","r");<BR> if(fp==NULL)<BR> exit(1);<BR> for(i=0;i<N+2;i++)<BR> for(j=0;j<N+2;arr[i][j].num=arr[i][j].flag=0,j++);<BR> for(i=1;i<=N;i++)<BR> for(j=1;j<=N;fscanf(fp,"%d",&arr[i][j].num),j++);<BR> fclose(fp);<BR> /*由于是回溯寻找,所以从出口开始往回找*/<BR> cur.x=cur.y=10;<BR> arr[10][10].flag=1;<BR> push(s,cur);<BR> do<BR> {<BR> maze var;<BR> var=search(arr,cur.x,cur.y);<BR> /*如果返回的是tag==1,说明该迷宫点不通*/<BR> if(var.tag)<BR> {<BR> /*取出栈顶第一个元素,并弹出*/<BR> cur=GetTop(s);<BR> pop(s);<BR> }<BR> else<BR> {<BR> /*否则压入栈,把当前的坐标替换*/<BR> push(s,var.point);<BR> cur=var.point;<BR> }<BR> }while(cur.x!=1||cur.y!=1);/*出口的条件*/<BR> s=s->link;<BR> i=1;<BR> /*打印栈里的内容*/<BR> while(s->link->link)<BR> {<BR> way[i][0]=s->xy.x;way[i][1]=s->xy.y;<BR> printf("(%d,%d)->",s->xy.x,s->xy.y);<BR> s=s->link;<BR> i++;<BR> }<BR> printf("(%d,%d)",10,10);<BR> way[i][0]=way[i][1]=10;<BR> getch();<BR> /*建立独立图形运行程序*/<BR> registerbgidriver(EGAVGA_driver);<BR> initgraph(&gdriver,&gmode,"c:\\turboc2");<BR> /*输出迷宫图*/<BR> draw_maze(arr);<BR> draw_way(way,i);<BR> getch();<BR> closegraph();<BR> return 0;<BR>}<BR>/*<BR> 函数功能:查找8个方向的位置。<BR>*/<BR>maze search(info a[][N+2],int x,int y)<BR>{<BR> maze var;<BR> /*左*/<BR> if(a[x][y-1].num==1&&a[x][y-1].flag==0)<BR> {<BR> a[x][y-1].flag=1;<BR> var.point.x=x;<BR> var.point.y=y-1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*左上*/<BR> if(a[x-1][y-1].num==1&&a[x-1][y-1].flag==0)<BR> {<BR> a[x-1][y-1].flag=1;<BR> var.point.x=x-1;<BR> var.point.y=y-1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*上*/<BR> if(a[x-1][y].num==1&&a[x-1][y].flag==0)<BR> {<BR> a[x-1][y].flag=1;<BR> var.point.x=x-1;<BR> var.point.y=y;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*右上*/<BR> if(a[x-1][y+1].num==1&&a[x-1][y+1].flag==0)<BR> {<BR> a[x-1][y+1].flag=1;<BR> var.point.x=x-1;<BR> var.point.y=y+1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*右*/<BR> if(a[x][y+1].num==1&&a[x][y+1].flag==0)<BR> {<BR> a[x][y+1].flag=1;<BR> var.point.x=x;<BR> var.point.y=y+1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*右下*/<BR> if(a[x+1][y+1].num==1&&a[x+1][y+1].flag==0)<BR> {<BR> a[x+1][y+1].flag=1;<BR> var.point.x=x+1;<BR> var.point.y=y+1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*下*/<BR> if(a[x+1][y].num==1&&a[x+1][y].flag==0)<BR> {<BR> a[x+1][y].flag=1;<BR> var.point.x=x+1;<BR> var.point.y=y;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> /*左下*/<BR> if(a[x+1][y-1].num==1&&a[x+1][y-1].flag==0)<BR> {<BR> a[x+1][y-1].flag=1;<BR> var.point.x=x+1;<BR> var.point.y=y-1;<BR> var.tag=0;/*表示还可继续查询*/<BR> return var;<BR> }<BR> var.tag=1;<BR> return var;<BR>}<BR>/*<BR> 函数功能:打印整个迷宫图。<BR>*/<BR>void draw_maze(info a[][N+2])<BR>{<BR> int i,j;<BR> for(i=0;i<N+2;i++)<BR> for(j=0;j<N+2;j++)<BR> if(a[i][j].num==1)<BR> {<BR> setfillstyle(1,WHITE);<BR> bar(140+j*20-9,80+i*20-9,140+j*20+9,80+i*20+9);<BR> }<BR> else<BR> {<BR> setfillstyle(1,BLUE);<BR> bar(140+j*20-9,80+i*20-9,140+j*20+9,80+i*20+9);<BR> }<BR>}<BR>/*<BR> 函数功能:打印出迷宫出路。<BR>*/<BR>void draw_way(int way[][2],int i)<BR>{<BR> int j;<BR> setfillstyle(1,RED);/*红色输出走的具体路线*/<BR> for(j=1;j<=i;j++)<BR> {<BR> bar(140+way[j][1]*20-9,80+way[j][0]*20-9,140+way[j][1]*20+9,80+way[j][0]*20+9);<BR> sleep(1);<BR> }<BR> setcolor(GREEN);<BR> settextstyle(0,0,2);<BR> outtextxy(165,330,"Find a way!");<BR>}</P></DIV> hao hao good!!good!! very good!! 迷宫问题是程序员的教材上得 停车场用栈和队列应该可以了
页:
[1]
