孤勇者探险(图的遍历)
作者 YJ
单位 西南石油大学
一款名为“孤勇者探险”的游戏,游戏中共有若干个小岛,每个岛上均有怪兽,闯关者打倒岛上的怪兽则可获得该岛对应的游戏积分(每个岛的积分根据难度可能不相同),编写程序求出最终闯关成功者(闯过所有小岛)共获得多少积分,并给出对应的闯关行进路线。
思路提示:
游戏地图可抽象为图结构,且一定为连通图,例如:
图中顶点的值则为每个小岛对应的积分,‘0’小岛为起点,从0号开始遍历,将各个顶点的值累加则为最终获得得分,同时输出遍历序列,则为对应的闯关行进路线。
函数接口定义:
void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储
int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为函数返回值
裁判测试程序样例:
#include <stdio.h>
#include <stdlib.h>
#define MVNum 100int visited[MVNum];typedef struct{int vexs[MVNum]; //顶点向量,各小岛对应积分int arcs[MVNum][MVNum]; //邻接矩阵int vexnum,arcnum; //顶点数,边数
}AMGraph;
int LocateVex(AMGraph G,int u) //查询顶点u的下标{int i;for(i=0;i<G.vexnum;++i)if( u==G.vexs[i] ) return i;return -1;}
void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储
int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为返回值
int main(){AMGraph G;int i;CreateUDG(G);i=LocateVex(G,0); //找到起点下标if(i>=0)printf("\n%d",DFS(G,i));return 0;
}/* 请在这里填写答案 */
输入格式:
第1行依次输入各个小岛对应得分(整数),即顶点的值,以-1结束(顶点不包含-1)
接下来若干行输入每条边的信息,格式为:v1空格v2(v1、v2为小岛对应的下标),直到输入‘-1 -1’结束。
输出格式:
输出两行数据,第一行为行进路线,以小岛的积分(即顶点的值)作为小岛标识,每个标识之间间隔一个空格,第二行为一个整数,为最终获得积分,无换行。
输入样例:
0 1 2 3 4 5 6 -1
0 3
0 4
3 2
3 1
2 5
1 5
4 5
5 6
-1 -1
输出样例:
0 3 1 5 2 4 6
21
void CreateUDG(AMGraph &G)
{int i=0;int j;scanf("%d",&G.vexs[i]);G.vexnum=0;while(G.vexs[i]!=-1){i++;scanf("%d",&G.vexs[i]);G.vexnum++;}for(i=0;i<G.vexnum ;i++){for(j=0;j<G.vexnum;j++){G.arcs[i][j]=0;}}int v1,v2;G.arcnum=0;scanf("%d %d",&v1,&v2);while((v1 != -1) && (v2 != -1)){G.arcs[v1][v2]=1;G.arcs[v2][v1]=G.arcs[v1][v2];G.arcnum++;scanf("%d %d",&v1,&v2);}
}
int DFS(AMGraph G, int v)
{int cnt=0;printf("%d ",G.vexs[v]);cnt+=G.vexs[v];visited[v]=1;int i;int k=0;for(i=0;i<G.vexnum;i++){if((G.arcs[v][i]!=0) && (!visited[i])){k=DFS(G,i);cnt+=k;}}return cnt;
}
图的创建和遍历一定要注意把顶点下标和顶点的值区分开。