void path(mgraph c,int m,int n,int k) { int s,t=k+1,length=0;//t用于存放路径上下一个顶点对应的d[]数组元素的下标 if(d[k]==n&&k<8)//若d[k]是终点n且景点个数<=8,则输出该路径 { for(s=0;s<k;s++)//计算路径长度 { length=length+c.arcs[d[s]][d[s+1]].adj; } if(length<=100)//打印路径长度小于定长的路径 { for(s=0;s<k;s++)//输出该路径。s=0时为起点m { printf("%d%s--->",d[s],c.vexs[d[s]].name); } printf("%d%s ",d[s],c.vexs[d[s]].name);//输出最后一个景点名(即顶点n的名字,此时s==k) printf("总路线长为%d米\n\n",length); } } else { s=1; while(s<=c.vexnum)//从第m个顶点,试探所有顶点是否有路径 { if((c.arcs[d[k]][s].adj<Infinity)&&(visited[s]==0))//顶点m到顶点s有边(权值不为无穷大),且未被访问 { visited[s]=1; d[k+1]=s;//存储顶点编号 path(c,m,n,t); visited[s]=0;//将找到的路径上顶点的访问标志重新设置为0,以用于试探新的路径 } s++;//试探从下一个顶点s开始是否有到终点的路径 } } }
时间: 2024-04-28 09:23:04 浏览: 66
这段代码是用来求解从起点m到终点n,经过不超过8个景点的最短路径,并输出路径长度小于等于100的所有路径。其中,mgraph表示一个图的邻接矩阵,d[]数组存储了搜索过程中经过的所有景点的编号,visited[]数组表示该顶点是否已经被访问过。这段代码使用了递归的方式来实现深度优先搜索,每次搜索时会试探从当前景点出发,是否存在一条通往终点n的路径。如果存在这样的路径,则将该路径存储在d[]数组中,并继续递归搜索下一个顶点。如果不存在这样的路径,则返回到上一个顶点,继续尝试其他顶点。最后,输出所有路径长度小于等于100的路径。
相关问题
#include<stdio.h> #define NUM1 7 #define NUM2 15 #define MAX_VERTEX_NUM 105 typedef int VRType; typedef struct{ VRType adj; }ArcCell,AdjMatrix[NUM1][NUM2]; struct MGraph{ AdjMatrix arcs; }; void creatFUDN(MGraph &G){ int i,k; for(i=0;i<7;i++){ for(k=0;k<15;k++){ G.arcs[i][k].adj=0; } } } void creat(MGraph &G,int n){ int i,k,p=1,l; l=2*n+1; G.arcs[0][n+1].adj=1; for(i=1;i<=n-1;i++){ for(k=0;k<15;k++){ if(k==0){ G.arcs[i][k].adj=0; } if(k==14){ G.arcs[i][k].adj=0; } else{ G.arcs[i][k].adj=G.arcs[i-1][k-1].adj+G.arcs[i-1][k+1].adj; } } } for(i=0;i<=n-1;i++){ for(k=0;k<l;k++){ if(p!=l){ if(G.arcs[i][k].adj!=0){ printf("%d",G.arcs[i][k].adj); p++; } if(G.arcs[i][k].adj==0){ printf(" "); p++; } } if(p==l){ if(G.arcs[i][k].adj!=0){ printf("%d\n",G.arcs[i][k].adj); p=1; } if(G.arcs[i][k].adj==0){ printf(" \n"); p=1; } } } } } int main(){ int i; MGraph g; printf("请输入杨辉三角的行数:"); scanf("%d",&i); creatFUDN(g); creat(g,i); return 0; } 上面这段c语言的代码为什么不能输出三角形形状的杨辉三角
这段代码没有输出杨辉三角形状,主要原因在于输出时没有考虑对齐问题。每行输出的数字个数不一定相同,因此需要在输出时进行对齐。可以在输出每个数字时,根据位数添加对应的空格来对齐。另外,输出换行时也需要考虑对齐。可以在每行输出完后,根据行数和总行数的关系,来决定是否需要在行末输出空格或换行符。以下是修改后的代码:
```
#include<stdio.h>
#define NUM1 7
#define NUM2 15
#define MAX_VERTEX_NUM 105
typedef int VRType;
typedef struct{
VRType adj;
}ArcCell,AdjMatrix[NUM1][NUM2];
struct MGraph{
AdjMatrix arcs;
};
void creatFUDN(MGraph &G){
int i,k;
for(i=0;i<7;i++){
for(k=0;k<15;k++){
G.arcs[i][k].adj=0;
}
}
}
void creat(MGraph &G,int n){
int i,k,p=1,l;
l=2*n+1;
G.arcs[0][n+1].adj=1;
for(i=1;i<=n-1;i++){
for(k=0;k<15;k++){
if(k==0){
G.arcs[i][k].adj=0;
}
if(k==14){
G.arcs[i][k].adj=0;
}
else{
G.arcs[i][k].adj=G.arcs[i-1][k-1].adj+G.arcs[i-1][k+1].adj;
}
}
}
for(i=0;i<=n-1;i++){
for(k=0;k<l;k++){
if(p!=l){
if(G.arcs[i][k].adj!=0){
printf("%*d", 2, G.arcs[i][k].adj); // 对齐输出每个数字
p++;
}
if(G.arcs[i][k].adj==0){
printf(" "); // 对齐输出空格
p++;
}
}
if(p==l){
if(G.arcs[i][k].adj!=0){
printf("%*d\n", 2, G.arcs[i][k].adj); // 对齐输出每个数字并换行
p=1;
}
if(G.arcs[i][k].adj==0){
printf(" \n"); // 对齐输出空格并换行
p=1;
}
}
}
}
}
int main(){
int i;
MGraph g;
printf("请输入杨辉三角的行数:");
scanf("%d",&i);
creatFUDN(g);
creat(g,i);
return 0;
}
```
讲解下面的代码 //最短路径—— Dijiksra //邻接矩阵 无向图 #include<stdio.h> #include<stdlib.h> #define Max 1001 #define MaxSize 100 //1)图的数据类型 typedef struct { int vertex[MaxSize];//存储点的信息 int edge[MaxSize][MaxSize];//存储便之间的邻接关系 int vertexNum,edgeNum;//点的个数,边的个数 }MGraph; //2)构造一个图 MGraph CreatGraph(int n,int m) { MGraph G; int i,j,a,b,c; //点 边 G.vertexNum=n; G.edgeNum=m; //点的信息 for(i=1;i<=G.vertexNum;i++) { G.vertex[i]=i; } //边邻接关系的初始化 for(i=1;i<=G.vertexNum;i++) { for(j=1;j<=G.vertexNum;j++) { if(i==j) { G.edge[i][j]=0; } else { G.edge[i][j]=Max; } } } //输入m行边的信息 for(i=1;i<=G.edgeNum;i++) { scanf("%d %d %d",&a,&b,&c); G.edge[a][b]=c; G.edge[b][a]=c;//无向图 } return G; } //3)核心算法 void Dijkstra(MGraph G, int v,int n)/*从源点v出发*/ { int i, k, num, dist[n],d[n]; //初始化 for (i = 2; i <=G.vertexNum; i++) { dist[i] = G.edge[v][i];//存储当前最短路径的长度 } for (num = 1; num < G.vertexNum; num++) { for (k = 2, i = 2; i <=G.vertexNum; i++) { if(dist[k]==0) { for(k=2;k<=G.vertexNum;k++) { if((dist[k]==0)&&(dist[k+1]!=0)) { k++; break; } } } if ((dist[i] != 0) && (dist[i] < dist[k])) { k = i; } } for (i = 2; i <=G.vertexNum; i++) { if (dist[i] > dist[k] + G.edge[k][i]) { dist[i] = dist[k] + G.edge[k][i]; } } d[k]=dist[k]; dist[k] = 0; } printf("%d",d[G.vertexNum]); } int main() { int n,m;//场所,边 scanf("%d %d",&n,&m); //创造 MGraph G; G=CreatGraph(n,m); //Dijksra int v; v=1; Dijkstra(G,v,n); return 0; }
这段代码实现了Dijkstra算法求无向图中的最短路径。下面是详细解释:
1.定义图的数据类型
定义了一个结构体MGraph,包含了存储点的信息和便之间的邻接关系,以及点的个数和边的个数。
2.构造一个图
CreatGraph函数用来构造一个无向图,通过输入点和边的信息来初始化邻接矩阵。其中,点的信息是顺序排列的,边的邻接关系初始化为最大值Max,表示不相邻。
3.核心算法
Dijkstra函数实现了Dijkstra算法,用来求从源点v到其它点的最短路径。首先,初始化dist数组,表示从源点v到其它点的当前最短路径的长度。然后,通过循环找到当前dist数组中最小的元素,设其下标为k,将其加入d数组中,并将其dist值设为0,表示已经找到了最短路径。接下来,更新dist数组,如果从源点v到点i的路径经过点k比当前的最短路径更短,则更新dist[i]的值。重复以上步骤,直到所有点都加入d数组中,此时d[G.vertexNum]的值即为从源点v到终点n的最短路径长度。
4.主函数
主函数中,先输入点和边的个数,构造一个图,然后调用Dijkstra函数求最短路径,并输出结果。
阅读全文