❶ 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萬我給你干!