数据结构课程设计图的应用个人报告
1979:Red and Black
第一、题目理解
有一个长方形的房间,覆盖平方米瓷砖。
每一层的颜色或是红色或黑色。
一名男子正站在一个黑色的瓷砖。
从瓷砖,他可以转移到四个相邻瓷砖。
但是他不能进入红色瓷砖,他只能移动黑砖。
写程序的数量黑色瓦片,他可以达到通过重复上述动作。
题目要求只能走黑格子而不能走红格子,从其中一块黑格子开始求出可以到达的黑格子数。
第二、算法思想
用图的深度优先遍历可以解决问题,从开始的位置探索四个方向的格子,用递归直到走完所有黑格子。
建图结构,图的每一个顶点表示瓦片,如果两个相邻顶点都表示黑瓦,则在两个顶点间连线,表示可以从一片黑瓦移到另一片上;对建好的图从给定的起始点开始调用深度优先遍历算法,能访问几个顶点表示重复移动能达到的黑瓦的数目.
第三、如何实现
用一个二维数组来表示房间格子的分布。
用变量count来记录可行黑格子的个数。
用深度优先遍历算法来遍历整个二维数组。
search(int k,int t){ // Search函数,递归调用.
if(k>=0 && k<h && t>=0 && t<w){
if(a[k][t]=='.'){
count++;
a[k][t]='*';
search(k-1,t);search(k+1,t);
search(k,t-1);search(k,t+1);
} }
}
1915: Knight Moves
第一、题目理解
题目要求要计算国际象棋中骑士从一个指定位置到目的位置的最少步数。
因为每一次都有八种走法,要把可行的走法记录下来,直到走到终点为止。
输出最少的步数。
第二、算法思想
此问题可利用广度优先遍历算法,用一个数组来记录可行的走法,然后再用另一个数组来记录数组中的每一种情况的可行走法,重复以上步骤,当终点出现在第n数组中则结束。
数组的数量n就是最小的步数。
第三、如何实现
数据结构:
typedef struct
{ //定义顶点的结构
int x, y;
int direction;
}VRType;
typedef struct
{ int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int length;
}MGraph;
typedef VRType QElemType; //队列定义
#define MAXQSIZE 1000
typedef struct
{ QElemType *base;
int front;
int rear;
}SqQueue;
1094:Sorting It All Out
第一、题目理解
给一堆格式为 A < B 的关系式,然后判断有没有一个可以排列的顺序,输出判断结果。
当一个升序序列确定时,输出确定时处理到第几个关系式和排好序的升序序列;当不确定时,输出不确定;当矛盾时,输出发现矛盾时处理到第几个关系。
第二、算法思想
用拓扑排序可以解决问题。
把这些字母之间的关系看成有向图。
其算法思想是:(1)在有向图中选一个没有前驱的顶点且输出之。
(2)从图中删除该顶点和所有以他为尾的弧。
重复上述两步,直到全部顶点输出。
第三、如何实现(可以是全局变量的设置,用的数据结构等)
用邻接表作为存储结构,把每个字母作为顶点。
依照它们之间的关系初始化表中每个顶点的入度数。
全局变量:
int indegree[MAX_VERTEX_NUM];
int list[MAX_VERTEX_NUM];//记录序列
数据结构:
typedef struct
{//定义堆栈
SElemType *top;
SElemType *base;
int stacksize;
}SqStack;
//图的邻接表储存表示
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct
{
AdjList vertices;
int vexnum;
int arcnum;
}ALGraph;
typedef struct
{
// VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
1251:Jungle Roads
第一、题目理解
大道路网的维护成本太高了,必须选择停止维持一些道路,当然需要有一些办法让所有村庄之间都有路到达,即使路线并不像以前一样短。
写一个程序,将解决选择一些路,使得总的维护费用最少。
第二、算法思想
将每个村庄看成一个顶点,路看成边,构造图,求图的最小生成树
第三、如何实现(可以是全局变量的设置,用的数据结构等)
typedef struct Aov{ //定义结构体存储与每个村庄直接相连的村庄以及保养此路的花费
int cost; //花费
char village; //村庄
struct Aov * next;
}*Aovc;
1125:Stockbroker Grapevine
第一、题目理解
要用最快的方法将消息传给你所有的客户,而客户只信任他们认为信得过的人,按照此要求找出传播最快的方法。
第二、算法思想
可用图的最短路径思想解决问题。
从某一个人出发到其他人的时间,求出他们当中耗时最少的那一位。
用Dijkstra算法求每个节点到其它节点的最短路径,从中选择到最远顶点最短路径的节点,就是让谣言传遍全部顶点时间最短的谣言源点,到最远顶点的最短路径就是那个时间.
由此求出从每一个点出发到所有点的最短路径后,相互进行比较,得到最小的点。
第二、如何实现(可以是全局变量的设置,用的数据结构等)
数据结构:
#define MAXNUM 2000
#define MAX_VERTEX_NUM 101
typedef struct
{
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum;
}MGraph;
typedef int closedge[MAX_VERTEX_NUM];。