❶ c语言程序设计的迷宫
这个可行的
/*4.3.3源程序*/
#include
<graphics.h>
#include
<stdlib.h>
#include
<stdio.h>
#include
<conio.h>
#include
<dos.h>
#define
N
20/*迷宫的大小,可改变*/
int
oldmap[N][N];/*递归用的数组,用全局变量节约时间*/
int
yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/
int
way[100][2],wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/
void
Init(void);/*图形初始化*/
void
Close(void);/*图形关闭*/
void
DrawPeople(int
*x,int
*y,int
n);/*画人工探索物图*/
void
PeopleFind(int
(*x)[N]);/*人工探索*/
void
WayCopy(int
(*x)[N],int
(*y)[N]);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/
int
FindWay(int
(*x)[N],int
i,int
j);/*自动探索函数*/
void
MapRand(int
(*x)[N]);/*随机生成迷宫函数*/
void
PrMap(int
(*x)[N]);/*输出迷宫图函数*/
void
Result(void);/*输出结果处理*/
void
Find(void);/*成功处理*/
void
NotFind(void);/*失败处理*/
void
main(void)/*主函数*/
{
int
map[N][N];
/*迷宫数组*/
char
ch;
clrscr();
printf("\n
Please
select
hand(1)
else
auto\n");/*选择探索方式*/
scanf("%c",&ch);
Init();
/*初始化*/
MapRand(map);/*生成迷宫*/
PrMap(map);/*显示迷宫图*/
if(ch=='1')
PeopleFind(map);/*人工探索*/
else
FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/
Result();/*输出结果*/
Close();
}
void
Init(void)/*图形初始化*/
{
int
gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
}
void
DrawPeople(int
*x,int
*y,int
n)/*画人工控制图*/
{/*如果将以下两句注释掉,则显示人工走过的路径,*/
setfillstyle(SOLID_FILL,WHITE);
/*设置白色实体填充样式*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);
/*恢复原通路*/
switch(n)/*判断x,y的变化,8个方向的变化*/
{
case
1:
(*x)--;break;
/*上*/
case
2:
(*x)--;(*y)++;break
;/*右上*/
case
3:
(*y)++;break;
/*右*/
case
4:
(*x)++;(*y)++;break;
/*右下*/
case
5:
(*x)++;break;
/*下*/
case
6:
(*x)++;(*y)--;break;
/*左下*/
case
7:
(*y)--;break;
/*左*/
case
8:
(*x)--;(*y)--;break;
/*左上*/
}
setfillstyle(SOLID_FILL,RED);/*新位置显示探索物*/
bar(100+(*y)*15-6,50+(*x)*15-6,100+(*y)*15+6,50+(*x)*15+6);
}
void
PeopleFind(int
(*map)[N])/*人工手动查找*/
{
int
x,y;
char
c=0;/*接收按键的变量*/
x=y=1;/*人工查找的初始位置*/
setcolor(11);
line(500,200,550,200);
outtextxy(570,197,"d");
line(500,200,450,200);
outtextxy(430,197,"a");
line(500,200,500,150);
outtextxy(497,130,"w");
line(500,200,500,250);
outtextxy(497,270,"x");
line(500,200,450,150);
outtextxy(445,130,"q");
line(500,200,550,150);
outtextxy(550,130,"e");
line(500,200,450,250);
outtextxy(445,270,"z");
line(500,200,550,250);
outtextxy(550,270,"c");/*以上是画8个方向的控制介绍*/
setcolor(YELLOW);
outtextxy(420,290,"Press
'Enter'
to
end");/*压回车键结束*/
setfillstyle(SOLID_FILL,RED);
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);/*入口位置显示*/
while(c!=13)/*如果按下的不是回车键*/
{
c=getch();/*接收字符后开始各个方向的探索*/
if(c=='w'&&map[x-1][y]!=1)
DrawPeople(&x,&y,1);/*上*/
else
if(c=='e'&&map[x-1][y+1]!=1)
DrawPeople(&x,&y,2);/*右上*/
else
if(c=='d'&&map[x][y+1]!=1)
DrawPeople(&x,&y,3);/*右*/
else
if(c=='c'&&map[x+1][y+1]!=1)
DrawPeople(&x,&y,4);/*右下*/
else
if(c=='x'&&map[x+1][y]!=1)
DrawPeople(&x,&y,5);/*下*/
else
if(c=='z'&&map[x+1][y-1]!=1)
DrawPeople(&x,&y,6);
/*左下*/
else
if(c=='a'&&map[x][y-1]!=1)
DrawPeople(&x,&y,7);
/*左*/
else
if(c=='q'&&map[x-1][y-1]!=1)
DrawPeople(&x,&y,8);
/*左上*/
}
setfillstyle(SOLID_FILL,WHITE);
/*消去红色探索物,恢复原迷宫图*/
bar(100+y*15-6,50+x*15-6,100+y*15+6,50+x*15+6);
if(x==N-2&&y==N-2)/*人工控制找成功的话*/
yes=1;
/*如果成功标志为1*/
}
void
WayCopy(int
(*oldmap)[N],int
(*map)[N])/*拷贝迷宫数组
*/
{
int
i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
oldmap[i][j]=map[i][j];
}
int
FindWay(int
(*map)[N],int
i,int
j)/*递归找路*/
{
if(i==N-2&&j==N-2)/*走到出口*/
{
yes=1;/*标志为1,表示成功*/
return;
}
map[i][j]=1;/*走过的地方变为1*/
WayCopy(oldmap,map);
/*拷贝迷宫图*/
if(oldmap[i+1][j+1]==0&&!yes)/*判断右下方是否可走*/
{
FindWay(oldmap,i+1,j+1);
if(yes)/*如果到达出口了,再把值赋给显示路线的way数组,也正是这个原因,所以具体路线是从最后开始保存*/
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i+1][j]==0&&!yes)/*判断下方是否可以走,如果标志yes已经是1也不用找下去了*/
{
FindWay(oldmap,i+1,j);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i][j+1]==0&&!yes)/*判断右方是否可以走*/
{
FindWay(oldmap,i,j+1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j]==0&&!yes)/*判断上方是否可以走*/
{
FindWay(oldmap,i-1,j);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j+1]==0&&!yes)/*判断右上方是否可以走*/
{
FindWay(oldmap,i-1,j+1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i+1][j-1]==0&&!yes)/*判断左下方是否可以走*/
{
FindWay(oldmap,i+1,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i][j-1]==0&&!yes)/*判断左方是否可以走*/
{
FindWay(oldmap,i,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
WayCopy(oldmap,map);
if(oldmap[i-1][j-1]==0&&!yes)/*判断左上方是否可以走*/
{
FindWay(oldmap,i-1,j-1);
if(yes)
{
way[wayn][0]=i;
way[wayn++][1]=j;
return;
}
}
return;
}
void
MapRand(int
(*map)[N])/*开始的随机迷宫图*/
{
int
i,j;
cleardevice();/*清屏*/
randomize();
/*随机数发生器*/
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(i==0||i==N-1||j==0||j==N-1)/*最外面一圈为墙壁*/
map[i][j]=1;
else
if(i==1&&j==1||i==N-2&&j==N-2)/*出发点与终点表示为可走的*/
map[i][j]=0;
else
map[i][j]=random(2);/*其它的随机生成0或1*/
}
}
}
void
PrMap(int
(*map)[N])/*输出迷宫图*/
{
int
i,j;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(map[i][j]==0)
{
setfillstyle(SOLID_FILL,WHITE);/*白色为可走的路*/
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);
}
else
{
setfillstyle(SOLID_FILL,BLUE);/*蓝色为墙壁*/
bar(100+j*15-6,50+i*15-6,100+j*15+6,50+i*15+6);
}
}
void
Find(void)/*找到通路*/
{
int
i;
setfillstyle(SOLID_FILL,RED);/*红色输出走的具体路线*/
wayn--;
for(i=wayn;i>=0;i--)
{
bar(100+way[i][1]*15-6,50+way[i][0]*15-6,100+
way[i][1]*15+6,50+way[i][0]*15+6);
sleep(1);/*控制显示时间*/
}
bar(100+(N-2)*15-6,50+(N-2)*15-6,100+
(N-2)*15+6,50+(N-2)*15+6);
/*在目标点标红色*/
setcolor(GREEN);
settextstyle(0,0,2);/*设置字体大小*/
outtextxy(130,400,"Find
a
way!");
}
void
NotFind(void)/*没找到通路*/
{
setcolor(GREEN);
settextstyle(0,0,2);/*设置字体大小*/
outtextxy(130,400,"Not
find
a
way!");
}
void
Result(void)/*结果处理*/
{
if(yes)/*如果找到*/
Find();
else/*没找到路*/
NotFind();
getch();
}
void
Close(void)/*图形关闭*/
{
closegraph();
}
❷ 急急急!!求大家帮我编一个公交线路咨询的程序,用c语言要能运行的,谢谢大家,百度上搜的有问题啊。
代码找到了一个,但是好像有点问题,有没有人帮忙修改一下啊
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>
#define max 30
#define len 20
#define MAX 100
typedef struct Linedot{//站
int stopno;//站号
char stopname[max];//站名
struct Linedot *next;
}linedot,*dot;
typedef struct lineway{//线路
int lineNo;//线路号局答
int stopnum;//该线路上站的个数
dot stop;//站
}way;
typedef struct lineNode{
int linenum;//线路条数
way data[len];//线路
}line;
typedef struct co_Node{
int zhanNo;
int busNo;
struct co_Node *next;
}co_node,*co_zhan;
typedef struct Node{
int firstbus;//始发车号
char stopname[max];//站名
co_zhan zhan;
}node,*list;
typedef struct zhanNode{
int vexnum;//顶点数
int arcnum;//弧数
node vexs[max];//顶点
}spot;
typedef struct sqNode//定义双向队列
{
int data;
struct sqNode *prior;
struct sqNode *next;
}sqnode,*sqlist;
typedef struct//双向链队列类型
{
sqlist front;
sqlist rear;
}LQ;
void initqueue(LQ *Q)//初始化队列
{
Q->front=Q->rear=new sqnode;
Q->front->data=Q->rear->data=-1;
Q->front->next=Q->rear->next=NULL;
Q->front->prior=Q->rear->prior=NULL;
}
void enqueue(LQ *Q,int e)//进队
{
sqlist p;
p=new sqnode;
p->data=e;
p->next=NULL;
p->prior=Q->front;
Q->rear->next=p;
Q->rear=p;
}
void dequeue(LQ *Q,int *e)//出队
{
Q->front=Q->front->next;
if(Q->front!=NULL)
*e=Q->front->data;
else
*e=-1;
}
typedef struct stackNode//定义栈
{
int figuer;
struct stackNode *next;
}stacknode,*stack;
void initstack(stack *S)//败腊闭初始化栈
{
*S=NULL;
}
void push(stack *S,int e)//进察裂栈
{
stack p;
p=new stacknode;
p->figuer=e;
p->next=*S;
*S=p;
}
int pop(stack *S,int *e)//出栈
{
stack p=*S;
if(p==NULL)
{
printf("栈空!\n");
return 0;
}
*e=p->figuer;
*S=(*S)->next;
delete p;
return 1;
}
void gettop(stack S,int *e)//得到栈顶
{
if(S==NULL)
{
printf("栈空!\n");
return;
}
*e=S->figuer;
}
int locate(spot C,char e[])
{
int i;
for(i=0;i<C.vexnum;i++)
{
if(strcmp(C.vexs[i].stopname,e)==0)
return i;
}
if(i>C.vexnum)
{
printf("Not found!\n");
return -1;
}
}
void init(FILE *fp,line *W,spot *C)//公交线路初始化
{
dot p,q;
co_zhan R;
int i,j,m,n,num;
char vex1[max],vex2[max];
if((fp=fopen("f.txt","r"))==NULL)//打开文件
{
printf("The file error!\n");
getchar();
exit(0);
}
fscanf(fp,"%d",&W->linenum);
for(i=0;i<W->linenum;i++)
fscanf(fp,"%d%d",&W->data[i].lineNo,&W->data[i].stopnum);//输入线路号和该线路上站的个数
for(i=0;i<W->linenum;i++)
{
W->data[i].stop=NULL;
for(j=0;j<W->data[i].stopnum;j++)
{
p=new linedot;
p->next=NULL;
fscanf(fp,"%d%s",&p->stopno,p->stopname);//输入站名
q=W->data[i].stop;
if(!q)
W->data[i].stop=p;
else
{
while(q->next)
q=q->next;
q->next=p;
}
}
}
fscanf(fp,"%d%d",&C->vexnum,&C->arcnum);
for(i=0;i<C->vexnum;i++)
{
fscanf(fp,"%s%d",C->vexs[i].stopname,&C->vexs[i].firstbus);
C->vexs[i].zhan=NULL;
}
for(i=0;i<C->arcnum;i++)
{
fscanf(fp,"%s%s%d",vex1,vex2,&num);
m=locate(*C,vex1);
n=locate(*C,vex2);
R=new co_node;
R->zhanNo=n;
R->busNo=num;
R->next=C->vexs[m].zhan;
C->vexs[m].zhan=R;
}
}
void search1(line W)//查询指定车次的线路及途经站点
{
dot p;
int i,n,k=0;
printf("请输入车次:");
scanf("%d",&n);
for(i=0;i<W.linenum;i++)
{
if(W.data[i].lineNo==n)
{
p=W.data[i].stop;
while(p)
{
if(k==0)
printf("%s",p->stopname);
else
printf("->%s",p->stopname);
p=p->next;
k++;
}
}
}
}
void search2(line W,spot C)
{
int k,i;
char vex[max];
dot p;
printf("请输入站点名:");
scanf("%s",vex);
k=locate(C,vex);
if(C.vexs[k].firstbus!=0)
printf("该站点的始发车有:%d\n",C.vexs[k].firstbus);
else
printf("该站无始发车!\n");
printf("该站点的过路车有:");
for(i=0;i<W.linenum;i++)
{
p=W.data[i].stop;
if(!p)
continue;
while(p)
{
if(strcmp(p->stopname,vex)==0&&p!=W.data[i].stop)
printf("%d ",W.data[i].lineNo);
p=p->next;
}
}
}
int stackempty(stack S)
{
if(S==NULL)
return 1;
return 0;
}
void updown(stack S,stack *S1)
{
stack p;
while(!stackempty(S))
{
p=new stacknode;
p->figuer=S->figuer;
p->next=*S1;
*S1=p;
S=S->next;
}
}
void printstack(spot C,stack S)//打印栈里的元素
{
stack S1,p;
co_zhan q;
initstack(&S1);
updown(S,&S1);
p=S1;
while(p)
{ q=C.vexs[p->figuer].zhan;
while(q)
{
if(p->next==NULL)
break;
if(q->zhanNo!=p->next->figuer)
q=q->next;
else
break;
}
printf("%s-%d->",C.vexs[p->figuer].stopname,q->busNo);
p=p->next;
}
}
void printqueue(sqlist Q,spot C)
{
sqlist p;
stack S,S1;
initstack(&S);
initstack(&S1);
p=Q;
while(p->data!=-1)
{
push(&S,p->data);
p=p->prior;
}
updown(S,&S1);
printstack(C,S1);
}
void search3(spot C,int s,int e)
{
co_zhan p;
int flag;
LQ Q;
sqlist q;
int u,k,i=1;
initqueue(&Q);
enqueue(&Q,s);
while(Q.front!=Q.rear)
{
dequeue(&Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
printf("-->>Line%d:",i++);
printqueue(Q.front->prior,C);
printf("%s\n",C.vexs[e].stopname);
dequeue(&Q,&u);
if(u==-1)
break;
p=C.vexs[u].zhan;
}
while(p)
{
k=p->zhanNo;
q=Q.front;
while(q->prior!=NULL)
{
if(q->data!=k)
{
q=q->prior;
flag=1;
}
else
{
flag=0;
break;
}
}
if(k!=s&&flag==1)
enqueue(&Q,k);
p=p->next;
}
}
}
void search4(spot C,int s,int e,LQ *Q,int visit[])
{
int u,k;
co_zhan p;
if(!visit[s])
{
visit[s]=1;
enqueue(Q,s);
while(Q->front!=Q->rear)
{
dequeue(Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
printf("-->>Line:");
printqueue(Q->front->prior,C);
printf("%s\n",C.vexs[e].stopname);
break;
}
while(p)
{
k=p->zhanNo;
if(!visit[k])
{
visit[k]=1;
enqueue(Q,k);
}
p=p->next;
}
}
}
}
int count(spot C,stack S,int e)
{
int i,j,n=0,No=-1;
stack p;
co_zhan q;
p=S;
while(p)
{
i=p->figuer;
p=p->next;
if(!p)
break;
j=p->figuer;
q=C.vexs[i].zhan;
while(q)
{
if(q->zhanNo==j&&q->busNo!=No)
{
n++;
No=q->busNo;
break;
}
else
q=q->next;
}
}
return n-1;
}
void destroy(stack *S)
{
stack p=*S;
while(!stackempty(*S))
{
*S=(*S)->next;
delete(p);
p=*S;
}
}
void savestack(stack S,stack *S2)
{
stack S1;
initstack(&S1);
updown(S,&S1);
updown(S1,S2);
}
void change(sqlist Q,stack *S)
{
sqlist p;
p=Q;
while(p->data!=-1)
{
push(S,p->data);
p=p->prior;
}
}
void search5(spot C,int s,int e,stack *S,stack *S2,int *m)
{
co_zhan p;
int flag;
LQ Q;
sqlist q;
int u,k,n1,n=MAX,i=1;
initqueue(&Q);
enqueue(&Q,s);
while(Q.front!=Q.rear)
{
dequeue(&Q,&u);
p=C.vexs[u].zhan;
if(u==e)
{
change(Q.front,S);
n1=count(C,*S,e);
if(n1<n)
{
savestack(*S,S2);
n=n1;
*m=n;
}
destroy(S);
dequeue(&Q,&u);
if(u==-1)
break;
p=C.vexs[u].zhan;
}
while(p)
{
k=p->zhanNo;
q=Q.front;
while(q->prior!=NULL)
{
if(q->data!=k)
{
q=q->prior;
flag=1;
}
else
{
flag=0;
break;
}
}
if(k!=s&&flag==1)
enqueue(&Q,k);
p=p->next;
}
}
}
int menu()
{
int n;
printf("*******************欢迎使用K城公交查询系统******************\n");
printf("**************1.查询指定车次的线路及途经站点****************\n");
printf("**************2.查询指定站点的始发车和过路车****************\n");
printf("**************3.查询指定起点和终点所经的所有线路************\n");
printf("**************4.查询指定起点和终点所经站点最少的线路********\n");
printf("**************5.查询指定起点和终点换乘次数最少的乘车路线****\n");
printf("**************0.退出****************************************\n");
printf("************************************************************\n");
printf("-----起点站:电力大学/朱辛庄/北郊农场桥东/京昌路回龙观/北京师\n");
printf(" 范大学/德胜门西/清华大学西门/圆明园/颐和园/香山\n");
printf("-----终点站:电力大学/朱辛庄/北郊农场桥东/京昌路回龙观/北京师\n");
printf(" 范大学/德胜门西/清华大学西门/中关村/圆明园/颐和园\n");
printf(" /西单\n");
printf("-----公交线路:345/442/696/681/699/826\n");
printf("************************************************************\n");
printf("请选择:");
scanf("%d",&n);
getchar();
return n;
}
void main()
{
stack S,S2,S3;
LQ Q;
int n,m,i,s,e,k=1,visit[len],u;
char ch='Y',start[max],end[max];
FILE *fp;
line W;
spot C;
init(fp,&W,&C);
do
{
n=menu();
switch(n)
{
case 1:search1(W);break;
case 2:search2(W,C);break;
case 3:
for(i=0;i<len;i++)
visit[i]=0;
initstack(&S);
printf("请输入起点和终点:");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%s到%s的所有路线如下:\n",C.vexs[s].stopname,C.vexs[e].stopname);
search3(C,s,e);break;
case 4:
for(i=0;i<len;i++)
visit[i]=0;
initqueue(&Q);
printf("请输入起点和终点:");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%s到%s的最短路线如下:\n",C.vexs[s].stopname,C.vexs[e].stopname);
search4(C,s,e,&Q,visit);break;
case 5:
initstack(&S);
initstack(&S2);
initstack(&S3);
printf("请输入起点和终点:");
scanf("%s%s",start,end);
s=locate(C,start);
e=locate(C,end);
printf("%s到%s的最少换乘路线如下:\n",C.vexs[s].stopname,C.vexs[e].stopname);
search5(C,s,e,&S,&S2,&m);
updown(S2,&S3);
pop(&S3,&u);
printf("-->>Line:");
printstack(C,S3);
printf("%s\n",C.vexs[e].stopname);
printf("共换乘%d次\n",m);break;
case 0:exit(0);break;
default:printf("error!\n");
}
getchar();
printf("\n继续吗?Y/N:");
scanf("%c",&ch);
}while(ch=='Y'||ch=='y');
}
❸ 怎样用c语言编写公交车线路查询系统
公交线路查询主要用的是数据结构中图的概念,从A地到B地的公交换乘最佳方案其实就是图的遍历,建议先去温习一下图,特别是广度优先遍历和深度优先遍历。关于C语言的使用则要用到跟图相关的存储方式——邻接矩阵或邻接表,建议学习一下这两个结构。
到网上搜了一个代码
http://bbs.mapabc.com/post/view.htm?bid=1&id=3569
用javascript写的,需要翻译一下。
❹ 数据结构C语言,图的临接表实现列车中转次数最少的路线。最少要有可行的思路,如果有代码希望能简单讲解
你只要求中转次数最少的话非常简单,不需要伏核知代码就可以理解
不知道你的临界表具体是设计成什么样了,但是你可以依据下面的思想稍微改进一下
假设这个新表W中:
所有的车站都被编号为0~n
W[0][]表示起点A
W[1][]表示重点B
W的初始化方式就是将所缺消有存在的边存进去(存边两头的车站编号)
例如
W = [A: 0 0 0 1 2 3 3 5
B: 1 3 4 2 4 2 4 4]
这表示车站0与车站1之间存在一条路(直接抵达的,无需中转),(0,3)、(0,4)...相同
估计你是无向图,这样就可以了,如果是有向图,方法类似,在建表时最好按A的序号排序,方便编码时控制遍历
W初始化完成后,就开始计算W^2,W^3...直到W^n为0,也就是计算W矩阵的幂,矩阵相乘的公式就不给你列了,这个例子中W的幂是3,W^4开始就等于0了
W^2 = [A:0 0 1 3
B:2 4 4 4]
W^3 = [A:0
B:4]
在W^i中存在的点对(x,y),即表示x与y之间存在一条需要中转i-1次的路径
例如W^2中的第一个点对(0,2),表示车站0与车站2之间存在一条需要中转1次的路径
实际应用中:
只要你的图不变,以上的矩阵计算只需要计算一次然后存下来就可以了;
如果你想知道具体的路线,可以遵循以下思路氏埋:
1.按上述方法,先查表,看看起点x与终点y之间是否存在通路
这个过程中就已经可以确定A、B之间的最少中转次数n了
2.写一个迭代n-1次的for循环,从W^(n-1)、B=y开始,终止于在W^0中发现路径(A,B),其中A=x,每次迭代中发现的B=y的路径集合{W‘}中的A即为下次迭代中的B
例如x = 0,y = 2:
1.W^0中不存在,W^1中存在,因此车站(0,2)之间至少要换成1次
2.从n=(1-1)=0开始:从W^0中查找B=y的所有点对W’={(1,2),(3,2)},其中A={1,3}即为中转车站集合
=> 最少中转路线为 车站0 - 车站1 - 车站2
车站0 - 车站3 - 车站2
以此类推即可,最少路线({W‘}中的元素)可能不唯一,如果你要找出所有解,就必须遍历全部
代码实现核心在于这个for循环,给个例子,具体怎么设计看你自己习惯
写个指针数组P,P[i]就是W^(i+1)的地址指针
temp[] = {y}; //初始化中转车站为终点y
for(i = n-1; i>=0; i--)
for(j = 0; j < num_W; j++) //遍历一边P[i]的第2行(B行)
for(k = 0; k < num_temp; k++) //找出所有B=temp[]的点对
if(P[i][1][j] = temp[k])
//存储找到的点对{W'}
//更新temp[] = {W'}中的{A}
❺ 怎样运用数据结构和c语言实现一个城市得公交路线图,极其任意两个站点之间的最短路径和换乘方法。
之间搜索最短塌歼路算法的C实现,常用的就是Dijkstra(迪杰斯特拉)算法,或者是银行家悄衫埋算法启蚂,总之,看懂源代码,基本就可以模仿!
❻ 用c语言编写一个简单程序,实现地铁两点计费问题,并打印路线
给你思路吧
1、创建一个站点类
成员包括站点名称char
和站或森点里程数int
2、创建计费函数
根衫瞎亩据两站点间里程数差值计算相应票价
3、主函数中神首初始化各个站点名称和站点里程
输入选择的两个站点类
输出两个站点名称和票价
❼ 怎样作用c语言实现一个城市的公招线路图,及求任意两个站点间的最短路径和换乘方法。
这是我写的程序和运行的结果,如果有不会的地方依然可以问我。
/*
首先我想说明几点问题。
1.我不知道你的题意中的路径是单向的还是双向的,不过我把路径设置成双向的了
2.说一下我程序的输入,首先输入一个n,表示该图中有n条路;然后有n行,每行
两个数x, y(1<=x, y<=99),表示这两个地点有一条路径。最后输入两个数,
表示计算这两点之间所有的路径
3.我的思路用的是深搜,不过广搜也是可以的
*/
#include <stdio.h>
#include <math.h>
int path[100][100];///path[i][j]为0表示i, j两点之间不通,为1表示有一条路
int stack[120], m=1, n, x, y;///存储路径
void dfs(int p)
{
int i, j;
for(i=1; i<=100; i++)
{
if(path[p][i]==1)
{
if(i == y)///如果深搜到了终点,就输出刚才经过的路径
{
for(j=0; j<m; j++)
{
printf("%-5d", stack[j]);
}
printf("%-5d\n", y);
}
else///如果该点不是终点
{
stack[m] = i;///将该点存起来
m++;
dfs(i);///接着深搜
m--;
}
}
}
}
int main()
{
int i, j;
memset(path, 0, sizeof(path));
scanf("%d", &n);
for(i=0; i<n; i++)
{
scanf("%d %d", &x, &y);
path[x][y] = path[x][y] = 1;///这两点之间有路径
}
scanf("%d %d", &x, &y);
stack[0] = x;
dfs(x);
}
❽ C语言学习路线
一,UNIX下C语言的学习路线。
工具篇
“公欲善其事,必先利其器”。编程是一门实践性很强的工作,在以后的学习或工作中,将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具。
(一)操作系统
在UNIX或Linux系统中学习C很方便,所以在开始的学习旅程前请先选择一个UNIX或Linux操作系统。
目前可供个人免费使用的UNIX或Linux系统有FreeBSD、RedHat Linux、SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等。
如果您一直使用Windows,身边又没有多余的机器安装UNIX,则可以使用VMware,通过VMware安装虚拟系统。
(二)编译工具
目前绝大多数Unix或Lnux系统都提供CC或GCC编译器,最简单的cc命令格式如下:
cc -o hello hello.c
在unix shell环境中敲入上面的代码会将hello.c程序编译成可执行文件hello。
make 工具如 GNU make、System V make 和 Berkeley make 是用来组织应用程序编译过程的基本工具,但是每个 make 工具之间又有所不同。
大部分UNIX和Linux程序都是通过运行make来编译的。make工具会读取一个包含指令的文件(这个文件的名字通常都是 makefile 或 Makefile,不过后文中统一称之为 “makefile”),并执行各种操作来编译程序。
(三)调试工具
最简单的调试工具:为程序添加打印语句
在对程序的运行机制有了一定的了解后,可以实用一些工具帮助进行调试,当然得学习一下这些工具得使用,如:dbx,gdb等。
还有一些内存工具可以帮查找内存泄漏或缓冲区溢出等一些问题,如:memwatch,yamd等
(四) 其他工具
1. vi或vim
Unix下文本编辑器。主要靠一堆命令来编辑文本文件,学Unix编程最好熟悉并熟练使用vi编辑器。
当然在实际工作中,可能需要一个集成编码环境或一个功能强大的图形化编辑工具。
2.netterm
最着名的网络终端软件之一,可以使用它方便的连接到主机系统中。
3.Secure shell
一个支持ssh协议得客户端工具,多数情况下用来连接linux系统。
书籍篇
“书是人类进步得阶梯”。学习一门新的知识,当然要选择几本适合自己得书籍,下面介绍一些我自己学习C语言使用过的书籍:
1.《C primer plus》
推荐理由:适合作为入门书和基本函数查询得参考资料。本书最新版为第五版,以ANSI C99为标准详细介绍了C语言。
2.《The C programming_Language》
推荐理由:C语言之父得作品权威性毋庸置疑。虽然书籍出版时间比较老,好像也没更新,不过仍不失为经典书籍,网上有这本书得英文电子版提供下载。
3.《C 专家编程》
推荐理由:本书可以帮助有一定经验的C程序员成为C编程方面的专家,最关键的是本书寓教于乐,充分享受编程的乐趣。
4.《C缺陷与陷阱》
推荐理由:书中所揭示的知识能帮助绕过C语言自身得陷阱和缺陷,减少代码中许多常见的Bug。
5.《unix环境高级编程》
推荐理由:既然是UNIX环境下C编程,就不得不说说UNIX编程书籍。Stevens先生的《unix环境高级编程》是竭力推荐的,也是案头必备(如果对网络编程有兴趣的,可以学习一下Stevens先生的《UNIX网络编程》两卷,如果觉得还不过瘾,可以再看看《TCP/IP详解》三卷)。
6.《计算机编程艺术》
推荐理由:算法大师得呕心沥血之作。计划出版五卷书,目前好像已出版3卷。对算法有兴趣得可以研究一下。
过程篇
1.学习C语法
语法的学习对于一个具有编程底子的来说,就很轻松了;即使以前没有学习过其他编程语言,我相信有2个星期,也能轻松搞定。
需要注意的是,不要太纠缠于语言的细节,比如:运算符优先级与结合性的问题等。
2.学习C标准库
ANSI C库把函数分为不同的组,每个组都具有与之相关的头文件。C语言标准库相对于其他语言,比如C++,Java来说是非常短小精悍的,但首先应着重对以下库进行学习:
ctype.h:字符处理
math.h:数学库
stdio.h:标准I/O库
stdlib.h:通用工具库
string.h:字符串处理
time.h:时间和日期
如果想了解完成的ANSI C库,可以购买相关的书籍,这些书籍一般会详细介绍每个函数的用户和一些注意点;
3.攻克C的难点
C语言声明:
C语言的声明确实觉得恐怖,比较晦涩难懂,而且声明的形式和使用的形式还类似。比如如下的声明恐怕就连很多熟悉C多年的程序员也不是一眼就能看出来的:
char * const * (*next)();
那么有没有一种好的记忆方法或规则来搞清楚呢,好像没有,如果有的话也不是这样折磨人了。不过可以看看《C专家编程》第三章的内容,或许会有所收获。
也只能多学多练了,所谓熟能生巧嘛,希望这个问题不要在你的心灵上留下阴影。
数组与指针:
数组与指针的关系,在标准中并没有作很详细的规定,而且好多C入门的书籍在这个问题上并没有给出很详细的说明,所以会给人造成很多误解。
对于这个问题,可以参考《C缺陷与陷阱》4.5节和《C专家编程》第4,9,10章,相信这里面的内容搞透彻,以后就不会再被这个问题搞迷惑。
指针与内存:
如果以后编写规模较大的程序,可能发现这个问题可能会是最大的烦恼,而且可能会是消耗最多调试时间的事项。
C版本的问题:
得特别小心该问题,最好不要的程序中混合使用不同版本C的特性,否则会带来很迷惑的问题。如果一定要用,最好清楚自己在做什么。
4. UNIX环境编程
学习了以上内容之后,就可以进行unix环境编程了。不过可能需要对操作系统理论有一点点的了解,这样学起来会比较轻松一些。
Unix环境编程,应该着重IO和进程两大块内容。《Unix环境高级编程》中对Unix环境编程有着非常详细且深入的论述,而且书中有大量实用性例子程序,不过可能得花上几个月得时间,好好啃一啃了。
在扎实掌握以上内容,不代表得C语言学习支路已经完成,相反,才刚刚开始。以后需要用学到得知识去解决大量不同实际问题,在不断得实践过程中,会近一步加深对C的理解。有了以上基础之后,会发现,在实践过程中需要的其他知识,会非常快速的掌握。
二,Windows程序员的学习路线
1.当然要熟悉下C语言了 入门可以选用潭浩强的 《C程序设计》(当然最好能读C Programming Language)特别要对其中的指针,结构体等东西一定要搞清楚了(要学好的很好至少要花费一个月时间) 为什么要从C开始呢:<1> C好学 <2> 大多数的操作系统核心部分是用C开发的 <3> C的效率高且语言成熟
2.在1的基础之上一定要认真学习一下数据结构 对C++程序员来说良好的数据结构可以让一个程序员很轻松的完成程序设计 糟糕的数据结构可以把一个程序员累死 推荐书籍:严蔚敏的《数据结构(C语言版)》或北京大学的一本中C++版的数据结构 书中说到的每个主体在程序设计中都会用到 认真学好会对的以后的C++程序设计有太多的好处 (3个月时间)
3.学好了2之后可以学习下《C++ PROGRAM DESIGN》这本书初步介绍了C++和如何使用C++写出Windows下的程序(要学好至少要花费3个月时间)
4.在3的基础之上可以读一本叫《Windows 95 程序设计》(它的最新版本是Programming Windows)这是一相Windows程序设计的领域的不朽之作(3个月时间) 通过2和3的学习已经成为了一个可以设计Windows程序的程序员了 要想更好的设计Windows程序设计 一定要借助框架结构不可 为什么:框架结构可以加快我们程序设计的速度 虽然使用框架使得我们的程序的效率低了那么一点 但随着当今计算机的运算能力的提升,不会感觉到这一点点的性能损失的反而会因为你使用的框架结构而使你的程序设计加快了速度 使用框架结构才算一个真正的VC++程序员
5.在4的基础之上可以看一些简单的MFC程序设计的书比如《Visual C++入门教程》之类的图书 这可以使你能写出一些带有通用控件的MFC程序 (1个月时间)
6.在5的基础之上已经可以很快开发一个软件了 但不了解MFC框架运行机制是很不好的 了解MFC的运行机制可以使以后的MFC程序设计工作做的更好 推荐书籍侯杰的《深入浅出MFC》 但这本书真的不适合初学者当你有了一定的开发经验以后这本书对来说确实很好 若很熟悉Windows下的SDK程序设计并打算或已经开始使用MFC进行软件开发 那这本书对来说再好不过了 (2个月时间)
7.在6的基础之上可以看下这本书《VC++技术内幕》由潘爱民译的 推荐看原着(3个月)
8.在以上基础之上为了更好的使用VC++这个工具 推荐看一下《VC++6.0宝典》(3个月) 从开发工具的角度讲这本书写的很好
9.为了更好的工作可以参考一下VC++程序设计百例
10.之后可以看一下《Windows核心编程》 这本书很好的讲解了Windows的编程 对你写系统程序很有好处的 推荐看原版
11.只了解其形不算真正的了解 之后还要认真的读一下Windows的内核源码 相信WRK 很容易找到的 可以配合《深入解析Windows操作系统》《Windows内核原理与实现》和《Windows内核情景分析》
12.其它一些东东《COM原理》(潘爱民) OpenGL D3D VC的数据库编程 图形图像 音视频处理和网络都要有所了解和会使用
13.要做到一个好的程序员一定要对驱动程序有所了解所以写一个文件驱动之类的东东是很有必要的
14.经过以上各步的学习完全成为一个优秀的Windows程序员了(前提是每一步要学好)
15.漏了一些重要的东东 编译原理 汇编及 组成原理 和设计模式等也是很重要的东东 只有学好了这些才能明白语言为什么要这样组织才能高效。
❾ c语言最短路径问题。
这是图中任意二点的最短距离算法吧。 Floyd算法。
这程序太乱了。
num这个参数也不知道什么意思,反正就是Floyd算法。这个算法就是一个三层循环,数据结构的课本有说过,还有一些处理,就是最短距离的走法,课本都有说,网上也有,去参考下吧。
❿ 急!!!求助!!!用C语言编写公交线路查询系统
给我1万我给你干!