PTA 地下迷宫探索
源代码如下 c语言
先抛开输入输出格式,因联通与非联通会有不同的输出格式,采用非递归(栈)进行图的遍历是本题主体
#include<stdio.h>
#include<stdlib.h>
#define max 1005//增大
#define overflow -1
#define ERROR -1
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int cur;
ArcNode * firstarc;
}VNode,AdjList[max];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct{
int * base;
int * top;
}SqStack;
void InitStack(SqStack * S){
(*S).base = (int *)malloc(sizeof(int)*max);
if(!(*S).base) exit(overflow);
(*S).top = (*S).base;
}
void Push(SqStack * S,int e){
*((*S).top++) = e;
}
int Pop(SqStack * S){
int e;
if((*S).base == (*S).top)
return ERROR;
e = *--(*S).top;
return e;
}
int GetTop(SqStack S){
int e;
e = *(--S.top);
return e;
}
int DFSTraverse(int e,SqStack *S,ALGraph G,int visited[]){
int i,j;
ArcNode * w;
Push(S,e);
printf("%d ",e);
visited[e] = 1;
while((*S).base != (*S).top){
i = GetTop(*S);
w = G.vertices[i].firstarc;
while(w!=NULL && visited[w->adjvex]==1) w = w->nextarc;
if(w == NULL){
Pop(S);
j = GetTop(*S);
if((*S).top-(*S).base >1){
printf("%d ",j);
}
if((*S).top-(*S).base == 1)
printf("%d",j);
}
else if(visited[w->adjvex] == 0){
Push(S,w->adjvex);
printf("%d ",w->adjvex);
visited[w->adjvex] = 1;
}
}
return 1;
}
int main(){
ALGraph G;
SqStack S;
InitStack(&S);
int M,N,i,p,q,start,flag=1;
int visited[max]={0};
ArcNode * r,* t,*w;
scanf("%d %d",&N,&M);
scanf("%d",&start);
G.arcnum = M;
G.vexnum = N;
for(i=1;i<=N;i++){
G.vertices[i].cur = i;
G.vertices[i].firstarc = NULL;
}
while(M--){
scanf("%d %d",&p,&q);
r = (ArcNode *)malloc(sizeof(ArcNode));
t = (ArcNode *)malloc(sizeof(ArcNode));
w = (ArcNode *)malloc(sizeof(ArcNode));
r->adjvex = p; r->nextarc = NULL;
t->adjvex = q; t->nextarc = NULL;
if(!G.vertices[q].firstarc){
G.vertices[q].firstarc = r;
}
else{
w = G.vertices[q].firstarc;
if(w->adjvex >= p){
G.vertices[q].firstarc = r;
r->nextarc =w;
}
else{//q的first比p小,p需要在后面找合适位置
if(!w->nextarc){
w->nextarc = r;
}
else{
while(w->nextarc){
if((w->nextarc)->adjvex >= p)
break;
w = w->nextarc;
}//while
r->nextarc = w->nextarc;
w->nextarc =r;
}//else
}//else
}//else
if(!G.vertices[p].firstarc){
G.vertices[p].firstarc = t;
}
else{
w = G.vertices[p].firstarc;
if(w->adjvex >= q){
G.vertices[p].firstarc = t;
t->nextarc =w;
}
else{
if(!w->nextarc){
w->nextarc = t;
}
else{
while(w->nextarc){
if((w->nextarc)->adjvex >= q)
break;
w = w->nextarc;
}//while
t->nextarc = w->nextarc;
w->nextarc =t;
}//else
}//else
}//else
}//while
DFSTraverse(start,&S,G,visited);
for(i=1;i<=G.vexnum;i++){
if(!visited[i]){
printf(" 0\n");
break;
}
}
if(i>G.vexnum)
printf("\n");
return 0;
}
PTA 地下迷宫探索相关推荐
- pta 地下迷宫探索
5-5 地下迷宫探索 (30分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战 ...
- PTA 地下迷宫探索(图的遍历dfs)
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- pta地下迷宫探索(详解)
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- PTA 6-7-1 地下迷宫探索
6-7-1 地下迷宫探索 (30分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战 ...
- 数据结构PTA 案例6-1.4 地下迷宫探索
案例6-1.4 地下迷宫探索 题目 解法 题目 假设有一个地下通道迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关.请问你如何从某个起点开始在迷宫中点亮所有的灯并回到起 ...
- 7-33 地下迷宫探索 (30 分)(思路加详解)
一:题目 7-33 地下迷宫探索 (30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰 ...
- 7-2 地下迷宫探索 (30 分)(C语言实现)
7-2 地下迷宫探索 (30 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争 ...
- 7-9 地下迷宫探索 (8 分)
7-9 地下迷宫探索 (8 分) 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生 ...
- 7-2 地下迷宫探索
7-2 地下迷宫探索 分数 30 全屏浏览题目 切换布局 作者 DS课程组 单位 浙江大学 地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村 ...
最新文章
- 点击展开 表格_Excel里面如何设置默认的表格和透视表样式
- 生物信息学搞计算机,生物信息学前景展望,谈谈感想(已经停止)
- 【二分查找万能模板,告别死循环、告别越界】Leecode 34. 在排序数组中查找元素的第一个和最后一个位置
- 非IT人士的云栖酱油之行 (程序猿迷妹的云栖之行)
- php程序控制结构,PHP 控制结构
- RMI 异常 no security manager: RMI class loader disabled
- 波士顿动力机器狗解锁“自动驾驶”,会跑步的Atlas真的很稳
- 批量增加域用户并设置为漫游用户
- [SQL Server] Access和SQL Server的数据迁移
- mysql将日期转换年份_mysql将日期转换为当前年份的相同日期
- 中国移动计算机类行测题目,2021三大运营商春招笔试:中国移动行测练习题(2)...
- python图片对比模块_使用Python的PIL模块来进行图片对比
- 景联文科技为自动驾驶DMS系统提供数据采集标注服务
- 关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用
- StringBuilder
- 与器材无关 简单几步解决单反出片灰蒙蒙问题
- [leetcode]322. 零钱兑换(Coin Change )C++代码实现
- URL中的20%、22%、26%、7B%、%7D、28%、29%解析成真实的字符
- 汇付国际为跨境电商赋能:做合规的跨境支付平台!
- 题目名称:组个最小数时间限制:1000ms内存限制:256MB提交通过率:43%
热门文章
- 数控直流稳压电源设计方案
- TechBits | TCP 使用 WireShark 进行抓包
- 大班幼儿告状行为与教师教育态度和方法的研究
- 从表格读取数据的自动化模板
- 大学计算机结课论文怎么写,大学本科计算机论文格式_大学本科计算机毕业论文范文...
- SQL中将两个日期进行相减得到分钟或者秒
- 基于GPT2实现中文新闻文本分类任务
- swagger:快速入门
- PotPlayer字幕实时翻译扩展插件
- 阅读图像显著性检测论文五:2011年版本的Global Contrast Based Salient Region Detection