【初级擂台】星级用户请不要参与

闻缺陷则喜何志丹
《深入浅出Visual c++》书籍作者
博客专家认证
2003-07-26 08:45:01
一个矩形机场的平面图可以分为M×N个同样大小的方块(M表示行,N表示列,M<=10,N<=10),每个方块可能是以下四种设施之一:

起跑线 ,用'**'表示;
跑道, 用'&&'表示;
建筑物, 用'##'表示;
停机场,依次编号为01,02,...99

例如,图一是某个机场(4×5)的平面图.

01
&&
**
&&
02

03
04
&&
05
06

07
08
&&
##
09

10
11
&&
&&
12
图 一

飞机在机场起落、移动和停泊的规则有:
飞机只能在起跑线上起落。若机场有多个起跑线,则飞机可在任一起跑线上起落。
飞机在起跑线上降落后,要寻找一个空的停机场,并移动到该处停泊,直至其离开机场为止,期间飞机不得离开该停机场。飞机起飞时,要能从该停机场移动到某个起跑线。
飞机只能在机场内的起跑线、跑道和空的停机场上移动,不能经过建筑物或已有飞机停泊的停机场。
由于飞机在机场移动所花的时间很短,可忽略不计,因此可假设在某个飞机移动时,其它所有飞机都不动,也无其他飞机起飞或降落。
飞机在机场的任一处最多有四种可能的移动方向,如图二所示。

图 二

每个停机场在同一时间只能停泊一架飞机。
每天早晨5:00机场开放,晚22:00机场关闭,机场开放前和关闭后均无飞机停泊。

已知每天出入机场的飞机共P架,我们有一张这P架飞机的日航班表,例如:

飞机编号 到达时间 起飞时间
01 05:00 13:00
05 08:00 16:00
13 07:00 21:00
04 09:00 09:30
39 12:50 13:50
为了使这P架飞机能顺利出入机场,需要寻找一种满足要求的飞机停泊调度方案(即:每架飞机降落后均能移动到某个空的停机场,起飞均能从停机场移动到某个起跑线)。
注意: 航班表中任意两个时间均不相同。

任务一 (20分)
对于图一所示的机场,根据给定的航班表,判断所给的调度方案是否满足要求(P<=20)。

[输入格式]
从键盘读入存放航班表的文件的文件名和存放调度方案的文件的文件名,每项占一行。
航班表在文件中的格式为:第1行行首为飞机总架数P,第2行至第P+1行,每行为一架飞机的信息,格式为:
飞机编号((到达时间((起飞时间 ('('表示一个空格符,以下同)
飞机编号可能为01,02,...50。
时间采用24小时制表示,即“时:分”,
时05,06,...,22 , 分:00,01,...,59 )
调度方案在文件中的格式为:从第1行起,每一行为一架飞机的调度结果,格式为:飞机号((所分配的停机场号。

[输出格式]
若调度方案满足要求,则在屏幕上输出“RIGHT!”信息,否则输出“WRONG!”信息。
[输入输出举例]
task1.lst task1.way
5
11((06:00((12:00 11((07
02((07:30((07:50 02((10
33((12:10((21:00 33((05
24((15:00((16:00 24((08
05((06:20((21:50 05((11


输 入 输 出
task1.lst WRONG!
task1.way

...全文
74 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxiangm 2003-11-17
  • 打赏
  • 举报
回复
mark
bangxiaozi 2003-08-30
  • 打赏
  • 举报
回复
数据结构应该这样学,请大家指教!?
john2a 2003-08-23
  • 打赏
  • 举报
回复
刚刚开始学数据结构,不太明白,来学习的!!!
  • 打赏
  • 举报
回复
只是我的习惯而己
===================
哈哈
以后尽量用中文
yndfcd 2003-08-12
  • 打赏
  • 举报
回复
只是我的习惯而己
yndfcd 2003-08-11
  • 打赏
  • 举报
回复
随便乱写了一通,也没有测试。不过方法应该没有错。

// Airport.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

bool searchpath(int index);

struct event
{
enum event_type{plane_arrive, plane_depart};
event_type plane_event;
float event_time;
int event_plane;
event* next_event;
event():next_event(NULL){}
};

class Queue
{
event* header;
public:
Queue():header(NULL){}
int InsertEvent(event* pevent);
event* RemoveHeader();
BOOL IsEmpty(){return header == NULL;}
};

int Queue::InsertEvent(event* pevent)
{
if(header == NULL)
{
header = pevent;
return 1;
}
if(pevent->event_time < header->event_time)
{
pevent->next_event = header;
header = pevent;
return 1;
}

event* cur_event = header;
while(cur_event->next_event != NULL)
{
if(cur_event->next_event->event_time > pevent->event_time)
break;
cur_event = cur_event->next_event;
}

pevent->next_event = cur_event->next_event;
cur_event->next_event = pevent;

return 1;
}

event* Queue::RemoveHeader()
{
event* ret = header;
header = ret->next_event;
return ret;
}

struct mapinfo
{
int parking_position;
int index;
};

Queue event_queue;//plane event queue
mapinfo parking_lot[20];//plane parking lot table
int station_map[20];//air station map

int main(int argc, char* argv[])
{
cout<<"Input AirPlane schedule"<<endl;
int plane_number;
int lot;
char event_time[20];
event* pevent;

while(1)//read in schedule plan
{
cin>>plane_number>>event_time;
if(!strcmp(event_time, "."))
break;
pevent= new event;

pevent->event_plane = plane_number;
char* pch = strchr(event_time, ':');
if(pch != NULL)
*pch = '.';
pevent->event_time = atof(event_time);
pevent->plane_event = event::plane_arrive;

event_queue.InsertEvent(pevent);

cin>>event_time;
pevent= new event;

pevent->event_plane = plane_number;
pch = strchr(event_time, ':');
if(pch != NULL)
*pch = '.';
pevent->event_time = atof(event_time);
pevent->plane_event = event::plane_depart;

event_queue.InsertEvent(pevent);

cin>>lot;
parking_lot[plane_number].parking_position = lot;
}

ifstream map("task1.way");//read in map info
char str[3];
int i;
while(map.good())
{
map>>str;
if(!strcmp(str,"**") || !strcmp(str,"##"))
{
station_map[i] = 1;
}else if(!strcmp(str,"##")){
station_map[i] = 2;
}else{
station_map[i] = 0;
parking_lot[station_map[i]].index = i;
}
}


while(!event_queue.IsEmpty())// process plane event
{
pevent = event_queue.RemoveHeader();
int index = parking_lot[pevent->event_plane].index;

if(!searchpath(index))
{
cout<<"Wrong"<<endl;
return 0;
}

if(pevent->plane_event == event::plane_arrive)
{
if(station_map[index] <= 0)
{
cout <<"Wrong"<<endl;
return 0;
}
station_map[index] = 1;
}else{
station_map[index] = 0;
}
}

cout<<"Right"<<endl;
return 0;
}

bool searchpath(int index)
{
//search too see if the dest is reachabe
//we use bread first search
queue<int> path;
bool visited[20] = {0};

visited[index] = 1;

int disp[] = { -5, -1 , 5, 1};

int d,n;

while(!path.empty())
{
d = path.front();
path.pop();
if(station_map[index] == 2)
return true;
for(int i = 0; i < 4; i++)
{
n = d + disp[i];
if( n < 0 && n >= 20) break;
if(visited[n]) break;
visited[n] = true;
path.push(n);
}
}

return false;
}
  • 打赏
  • 举报
回复
公司要求用英文作注?
  • 打赏
  • 举报
回复
更正了几个明显的错误,注释改成了中文,再贴一次。
=========================================
你的同事用英语
yndfcd 2003-08-11
  • 打赏
  • 举报
回复
更正了几个明显的错误,注释改成了中文,再贴一次。

// Airport.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;

bool searchpath(int index);

struct event
{
enum event_type{plane_arrive, plane_depart};
event_type plane_event;
float event_time;
int event_plane;
event* next_event;
event():next_event(NULL){}
};

class Queue
{
event* header;
public:
Queue():header(NULL){}
int InsertEvent(event* pevent);
event* RemoveHeader();
BOOL IsEmpty(){return header == NULL;}
};

int Queue::InsertEvent(event* pevent)
{//按时间顺序,将事件插入队列中
if(header == NULL)//
{
header = pevent;
return 1;
}
if(pevent->event_time < header->event_time)
{
pevent->next_event = header;
header = pevent;
return 1;
}

event* cur_event = header;
while(cur_event->next_event != NULL)
{//寻找插入点
if(cur_event->next_event->event_time > pevent->event_time)
break;
cur_event = cur_event->next_event;
}
//插入事件
pevent->next_event = cur_event->next_event;
cur_event->next_event = pevent;

return 1;
}

event* Queue::RemoveHeader()
{
event* ret = header;
header = ret->next_event;
return ret;
}

struct mapinfo
{
int parking_position;
int index;
};

Queue event_queue;//飞机事件队列
mapinfo parking_lot[20];//飞机到停机场院的映射表
int station_map[20];//机场地图:停机场 - 0 ,无法通过的格 - 1,起跑线 - 2

int main(int argc, char* argv[])
{
cout<<"Input AirPlane schedule"<<endl;
int plane_number;
int lot;
char event_time[20];
event* pevent;

while(1)//读取调度方案
{
cin>>plane_number>>event_time;
if(!strcmp(event_time, "."))
break;
pevent= new event;

pevent->event_plane = plane_number;
char* pch = strchr(event_time, ':');
if(pch != NULL)
*pch = '.';
pevent->event_time = atof(event_time);
pevent->plane_event = event::plane_arrive;

event_queue.InsertEvent(pevent);

cin>>event_time;
pevent= new event;

pevent->event_plane = plane_number;
pch = strchr(event_time, ':');
if(pch != NULL)
*pch = '.';
pevent->event_time = atof(event_time);
pevent->plane_event = event::plane_depart;

event_queue.InsertEvent(pevent);

cin>>lot;
parking_lot[plane_number].parking_position = lot;
}

ifstream map("task1.way");//读取地图
char str[3];
int i = 0;
while(map.good() && i < 20)
{
map>>str;
if(!strcmp(str,"**") || !strcmp(str,"##"))
{
station_map[i] = 1;
}else if(!strcmp(str,"&&")){
station_map[i] = 2;
}else{
station_map[i] = 0;
parking_lot[station_map[i]].index = i;
}
i++;
}


while(!event_queue.IsEmpty())// 对每个飞机事件进行处理
{
pevent = event_queue.RemoveHeader();
//得到飞要停泊的方格
int index = parking_lot[pevent->event_plane].index;

//查看是否能到达
if(!searchpath(index))
{
cout<<"Wrong"<<endl;
return 0;
}

if(pevent->plane_event == event::plane_arrive)
{//如果是飞机降落事件,查看指定位置是否己被占用
if(station_map[index] == 1)
{
cout <<"Wrong"<<endl;
return 0;
}
//更新地图
station_map[index] = 1;
}else{
//更新地图
station_map[index] = 0;
}
delete pevent;
}

//如果所有事件己处理完,说明方案可行
cout<<"Right"<<endl;
return 0;
}

bool searchpath(int index)
{
//查找一条到达任意一起跑线的路径
//使用广度优先搜索
queue<int> path;
bool visited[20] = {0};

visited[index] = 1;

int disp[] = { -5, -1 , 5, 1};//位移量表{上, 左, 下, 右}

int d,n;

while(!path.empty())
{
d = path.front();
path.pop();
if(station_map[d] == 2)//如果找到,返回真
return true;
for(int i = 0; i < 4; i++)
{
n = d + disp[i];
if( n < 0 && n >= 20) break;//下标是否合法
if(visited[n]) break;//是否访问过
visited[n] = true;
path.push(n);//将该结点放入队列中
}
}

return false;//所有结点己访问过,仍没有找到,返回假
}
yndfcd 2003-08-11
  • 打赏
  • 举报
回复
不太好测试.你所给的两个文件中的内容说得不是很清楚,跟本就不知道哪个文件中保存的是机场的地图信息。哪个保存的调度信息,输入的内容也看的不太明白。

我估计很多人连题目都没有看懂。一般来参加擂台的人还是很多的,可你这贴子人气这么少。以后出题希望能写得清楚一点。最好能有图示。
  • 打赏
  • 举报
回复
以后一定要测试
而且要加注释
文档
lukaizhi 2003-08-06
  • 打赏
  • 举报
回复
任务1为:满足要求
  • 打赏
  • 举报
回复
11((06:00((12:00 11((07
02((07:30((07:50 02((10
33((12:10((21:00 33((05
24((15:00((16:00 24((08
05((06:20((21:50 05((11
两个文件
左边的是: 11 号飞机06:00 进12:00 出站
右边的是: 11号飞机停泊在07 号停机场

  • 打赏
  • 举报
回复
可以向前后左右移动
ninesong 2003-07-29
  • 打赏
  • 举报
回复

01 && ** && 02
03 04 && 05 06
07 08 && ## 09
10 11 && && 12

图 一
ninesong 2003-07-29
  • 打赏
  • 举报
回复
飞机在机场的任一处最多有四种可能的移动方向,如图二所示。

图 二

????????????????????????@!#@@@@@@@@@@@@????????????????????????
beanbaby2002 2003-07-29
  • 打赏
  • 举报
回复
5
11((06:00((12:00 11((07
02((07:30((07:50 02((10
33((12:10((21:00 33((05
24((15:00((16:00 24((08
05((06:20((21:50 05((11

问以下 最后面 07 10 05 08 11什么意思
其他明白了,就这个不清楚
Alonefield 2003-07-29
  • 打赏
  • 举报
回复
sigh
NOI 96
ftaft
yixiaook 2003-07-29
  • 打赏
  • 举报
回复
典型的人工智能的问题
  • 打赏
  • 举报
回复
大家动动脑筋
错了但有自己的想法
也有分的
加载更多回复(5)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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