您的位置:首页 > 其它

校园导航系统——迪杰特斯拉算法

2014-09-11 20:12 225 查看
#include<iostream>
#include<string>
#include<fstream>
#include<Windows.h>
#include"stdio.h"
#include<ctype.h>
#include<conio.h>
#include<sstream>
using namespace std;
//最大值
#define INFINITY 32767
//管理员密码
string G_PIN;
//迪杰特斯拉算法的辅助数组
int have [12];
//存放景点信息
string info [12];
//最大顶点个数
#define MAX_V 30

//图
typedef struct
{
char* vexs[MAX_V];       //顶点向量
int arcs[MAX_V][MAX_V];//邻接矩阵
int vexnum,arcnum;//图的当前顶点数和弧数
} MGraph;

//从txt文件读取信息
void read()
{
ifstream in ("point.txt",ios::in);
if(!in)
{
cerr << "Open \"point.txt\" error!"<<endl;
exit(1);
}
int i = 0;
while(in.eof()==0)
{
in >> info[i];
//cout << info[i];
i++;
}
in.close();
ifstream inB ("G_PIN.txt",ios::in);
inB >> G_PIN;
in.close();
}
//将数据保存到txt文件中
void save()
{
ofstream out("point.txt",ios::out);
out.close();
ofstream outA ("point.txt",ios::out);
int i = 0;
while(i<12)
{
outA << info[i] <<endl;
i ++;
}
out.close();
ofstream outB ("G_PIN.txt",ios::out);
outB << G_PIN;
outB.close();

}
//输入密码回显星号
string getPass()
{
unsigned char c;
string pass;
int i = 0;
while ((c=getch())!='\r')
{
if (isprint(c) &&  c!=' ')
{
pass += c;
putchar('*');
}
else if (c=='\b')
{
pass += c;
putchar('\b');
putchar(' ');
putchar('\b');
}
}
putchar('\n');
int len = pass.length();
for(int j = 0; j<len; j++)
{
if(pass[j]=='\b')
{
pass.erase(j,1);
pass.erase(j-1,1);
j = 0;
len = pass.length();
}
}
return pass;
}
//密码验证(6-16位字符,数字和英文字符)
bool PIN_yanzheng(string pin)
{
if(pin.length()<6 || pin.length()>16)
{
cout<<"位数不符合!在6-16位之间!"<<endl;
return false;
}
else
{
for(int i = 0; i<pin.length(); i++)
{
if((pin[i]<'0') || (pin[i]>'z')||(pin[i]>'9'&&pin[i]<'A') || (pin[i]>'Z'&&pin[i]<'a'))
{
cout<<"只能包含数字和字母...."<<endl;
return false;
}
}
cout<<"密码合法..."<<endl;
return true;
}
}

//主菜单(1.管理员2.用户0.退出其余不合法)
void menu_main()
{
cout<<"          ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl;
cout<<"          ※※※※                                          ※※※※"<<endl;
cout<<"          ※※※※   欢迎使用中国海洋大学校园导航系统!      ※※※※"<<endl;
cout<<"          ※※※※       请选择用户登录或者管理员登陆       ※※※※"<<endl;
cout<<"          ※※※※           1   超级用户界面               ※※※※"<<endl;
cout<<"          ※※※※           2   普通用户界面               ※※※※"<<endl;
cout<<"          ※※※※           0    退出系统                  ※※※※"<<endl;
cout<<"          ※※※※                                          ※※※※"<<endl;
cout<<"          ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl;
cout<<"             选择一个功能(0-2):";
}
//景点菜单
void menu_point()
{

printf("                                        ①西门                                 ");printf("\n");
printf("                                        | \\                                   ");printf("\n");
printf("                                        |   ②----③足球场                     ");printf("\n");
printf("                                        |  体育馆  \\                          ");printf("\n");
printf("    南区                                |           \\                         ");printf("\n");
printf("    ⑩----⑾行远楼                     ⑥教学区       \\                       ");printf("\n");
printf("          |                            / \\ \\_         \\                     ");printf("\n");
printf("          |                       ___/     \\  \\_      ④北区宿舍             ");printf("\n");
printf("          |                   __/            \\   \\  /   \\_                  ");printf("\n");
printf("          |           ______/                 ⑦--⑧食堂   ⑤校医院            ");printf("\n");
printf("          |   ______/                      五子顶 /                            ");printf("\n");
printf("          | /                                    /                             ");printf("\n");
printf("          ⑿图书馆                              /                              ");printf("\n");
printf("                                               /                               ");printf("\n");
printf("                                              /                                ");printf("\n");
printf("                                             /                                 ");printf("\n");
printf("                                            /                                  ");printf("\n");
printf("                                           /                                   ");printf("\n");
printf("                                          ⑨东区                               ");printf("\n");
}
//管理员菜单
void G_menu()
{
cout<<endl<<endl<<endl;
cout<<"          \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl;
cout<<"          \3\3\3\3\3\3        1  查看景点信息           \3\3\3\3\3\3"<<endl;
cout<<"          \3\3\3\3\3\3        2  修改景点信息           \3\3\3\3\3\3"<<endl;
cout<<"          \3\3\3\3\3\3        3  修 改 密  码           \3\3\3\3\3\3 "<<endl;
cout<<"          \3\3\3\3\3\3        0  退 出  系 统           \3\3\3\3\3\3"<<endl;
cout<<"          \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl;
cout<<"           请选择一个功能(0-3):";
}
//用户菜单(1.查询景点信息,2.查询最短路径0.退出系统,其余不合法)
void Y_menu()
{
cout<<endl<<endl<<endl<<endl<<endl;
cout<<"                     \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl;

cout<<"                     \3\3\3\3\3\3\3  1   查询最短路径   \3\3\3\3\3\3\3"<<endl;
cout<<"                     \3\3\3\3\3\3\3  2   查询景点信息   \3\3\3\3\3\3\3"<<endl;
cout<<"                     \3\3\3\3\3\3\3  0   退 出 系  统   \3\3\3\3\3\3\3"<<endl;
cout<<"                     \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl;
cout<<"      请选择一个功能(0-2):";
}

//查看景点信息
void viewThePoint()
{
string num_str;
int num;
bool trail;
cout <<"输入你想要查看的景点编号(1-12):"<<endl;
do
{
cin >> num_str;
trail =("1"!=num_str&&"2"!=num_str &&"3"!=num_str && "4"!=num_str &&"5"!=num_str &&"6"!=num_str&&"7"!=num_str &&"8"!=num_str&&"9"!=num_str&&"10"!=num_str &&"11"!=num_str &&"12"!=num_str);
if(trail)
{
cout <<"输入正确的范围!"<<endl;
}
else
{
num = atoi(num_str.c_str());
cout << info[num-1] <<endl;
}

}
while(trail);
}
//管理员修改景点信息
void G_modifyThePoint()
{
//stringstream ss;
string num_str;
string str;
int num;
bool trail = false;
do
{
menu_point();
cout <<"您想要修改哪个景点的信息(1-12)?"<<endl;
cin >> num_str;
trail =("1"!=num_str&&"2"!=num_str &&"3"!=num_str && "4"!=num_str &&"5"!=num_str &&"6"!=num_str&&"7"!=num_str &&"8"!=num_str&&"9"!=num_str&&"10"!=num_str &&"11"!=num_str &&"12"!=num_str);
if(trail)
{
cout << "输入有误,请重新输入,1-12范围的数字。"<<endl;
Sleep(2000);
system("cls");
}

} while(trail);
num = atoi(num_str.c_str());
cout <<"您要修改的信息为:"<<info[num-1]<<endl;
cout <<"请输入将要修改的信息内容:"<<endl;
cin >> str;
cout << "确认信息修改?(N/n(不修改),其余输入确认修改)"<<endl;
string modify;
cin >> modify;
if(modify == "n" || modify =="N")
{
cout <<"信息未修改"<<endl;
return ;
}
else
{
info[num-1] = str;
cout <<"信息修改成功!"<<endl;
}

}
//管理员验证
bool G_yanzheng()
{
string pin;
char x;
int times=0;
do
{
cout<<"请输入您的管理员密码"<<endl;
pin = getPass();
times++;
if(pin == G_PIN)
{
cout<<"密码输入正确!"<<endl;
return true;
}
else
{
cout<<"密码输入错误!您还有"<<3-times<<"次机会!"<<endl;
if(times ==  3)
{
cout<<"您已经三次密码输入错误,不能继续输入密码!"<<endl;
return false;
}
cout<<"是否继续输入密码?否(N/n)是按其余键"<<endl;
cin >> x;
if( 'n'==x || 'N'==x)
{
return false;
}
}
}
while(pin !=G_PIN && times<3);
return false;
}
void G_change_PIN()
{
cout<<"为了保证您的账号安全,请输入您的原密码..."<<endl;
string PIN;
//cin>>PIN;
PIN = getPass();
if(PIN !=G_PIN)
{
cout<<"对不起,您的密码输入不正确..."<<endl;
return;
}
char x;
string pin;
string pin2;
do
{
do
{
cout<<"请输入新密码(6-16位,数字和字母)..."<<endl;
//cin>>pin;
pin = getPass();
}
while(PIN_yanzheng(pin) == false);
cout<<"请再次确认密码(6-16位,数字和字母)..."<<endl;
//cin>>pin2;
pin2=getPass();
if(pin2 == pin)
{
G_PIN = pin;
}
else
{
cout<<"两次输入密码不一致,是否重新输入密码?是(任意字符),否(N/n)"<<endl;
cin>>x;
if(x=='n' || x=='N')
{
cout<<"您的密码未修改!谢谢您的使用!"<<endl;
return;
}
}
}
while(pin !=pin2&& x!='n'&&x!='N');
cout<<"正在操作中,请耐心等候..."<<endl;
ofstream out("G_PIN.txt");
out<<G_PIN<<endl;
Sleep(2000);
cout<<"您的密码已经修改成功!谢谢您的使用!"<<endl;
}
//用户验证
bool Y_yanzheng()
{
return true;
}
//创建无向图
void createUDN(MGraph &G)
{
int i = 0,j=0;
G.vexnum = 12;
G.arcnum = 13;
G.vexs[0] = "西门";
G.vexs[1] = "体育馆";
G.vexs[2] = "风雨操场";
G.vexs[3] = "北区宿舍";
G.vexs[4] = "校医院";
G.vexs[5] = "教学区";
G.vexs[6] = "五子顶";
G.vexs[7] = "食堂";
G.vexs[8] = "东区";
G.vexs[9] = "南区";
G.vexs[10] = "行远楼";
G.vexs[11] ="图书馆";
for(i=0; i<G.vexnum; i++) //初始化路径长度
for(j=0; j<G.vexnum; j++)
{
if(i==j)
G.arcs[i][j]=0;
else
G.arcs[i][j]=INFINITY;
}
//为每一条边赋权
G.arcs[9][10] =G.arcs[10][9] = 100;
G.arcs[10][11] =G.arcs[11][10]=270;
G.arcs[11][5] =G.arcs[5][11]=500;
G.arcs[11][6]=G.arcs[6][11]=150;
G.arcs[6][7] =G.arcs[7][6] = 70;
G.arcs[0][5]=G.arcs[5][0]=200;
G.arcs[0][1]=G.arcs[1][0]=100;
G.arcs[1][2]=G.arcs[2][1]=130;
G.arcs[2][3]=G.arcs[3][2]=200;
G.arcs[3][7]=G.arcs[7][3]=110;
G.arcs[5][7]=G.arcs[7][5]=250;
G.arcs[3][4]=G.arcs[4][3]=120;
G.arcs[7][8]=G.arcs[8][7]=550;

}
//迪杰特斯拉算法
void Djtsl(MGraph &G,int v0,int p[MAX_V][MAX_V],int d[])
{
//迪杰斯特拉发求最短路径
int v,w,i,j,min;
int final[MAX_V];
int k=1;
for(v=0; v<G.vexnum; ++v)
{
//初始化
final[v]=0;
d[v]=G.arcs[v0-1][v];
for(w=0; w<G.vexnum; ++w)
p[v][w]=0;
if(d[v]<INFINITY)
{
p[v][v0-1]=1;
p[v][v]=1;
}
}
d[v0-1]=0;
final[v0-1]=1;
have[0]=v0-1;
for(i=1; i<G.vexnum; ++i)
{
//其余的vexnum-1个顶点
min=INFINITY;
for(w=0; w<G.vexnum; ++w)
if(!final[w])
if(d[w]<min) //如有W点离更近
{
v=w;
min=d[w];
}
final[v]=1;
have[k]=v;
k++;
for(w=0; w<G.vexnum; ++w) //更新当前最短路径及距离
if(!final[w]&&(min+G.arcs[v][w]<d[w]))
{
d[w]=min+G.arcs[v][w];
for(j=0; j<G.vexnum; j++)
p[w][j]=p[v][j];
p[w][w]=1;
}
}
}
//输入两点求最短路径
void shortPath()
{
stringstream ss;
string num_v0;
string num_end;
bool trail_v0 ;
bool trail_end;

MGraph G;
createUDN(G);
int v0,i,end;
int P[MAX_V][MAX_V];
int D[MAX_V];

do
{
cout <<"请输入起点(1-12):";
cin >> num_v0;
trail_v0=("1"!=num_v0&&"2"!=num_v0&&"3"!=num_v0&& "4"!=num_v0 &&"5"!=num_v0 &&"6"!=num_v0&&"7"!=num_v0 &&"8"!=num_v0&&"9"!=num_v0&&"10"!=num_v0 &&"11"!=num_v0 &&"12"!=num_v0);
if(trail_v0)
{
cout << "请正确输入起点(1-12)!"<<endl;
}

}while(trail_v0);
do
{
cout <<"请输入终点(1-12):";
cin >> num_end;
trail_end=("1"!=num_end&&"2"!=num_end &&"3"!=num_end && "4"!=num_end &&"5"!=num_end &&"6"!=num_end&&"7"!=num_end &&"8"!=num_end&&"9"!=num_end&&"10"!=num_end &&"11"!=num_end &&"12"!=num_end);
if(trail_end)
{
cout << "请正确输入终点(1-12)!"<<endl;
}

}while(trail_end);

v0 = atoi(num_v0.c_str());
end = atoi(num_end.c_str());

Djtsl(G,v0,P,D);
cout << "最短路径是:"<<endl;
for(i=0; i<G.vexnum; i++)
{
if(P[end-1][have[i]]==1)
cout << "-->"<<G.vexs[have[i]];

}
cout << "路径长度是:"<<D[end -1] <<endl;
}
void main()
{
system("color 37");

string choice_main;
string Y_choice;
string G_choice;
bool sign;//登录是否成功的标志
read();
do
{
menu_main();
cin>>choice_main;
if(choice_main=="0")
{
cout<<"正在关闭系统,请稍后..."<<endl;
Sleep(2000);
return ;
}

else if(choice_main == "1")
{
sign =G_yanzheng();
if(sign == false)
{
cout<<"登录失败!系统将在三秒内关闭!"<<endl;
Sleep(2000);
save();
return;
}
else
{
cout<<"登陆成功!"<<endl;
Sleep(2000);
system("cls");
do
{
G_menu();
cin>>G_choice;
if(G_choice == "1")
{
menu_point();
viewThePoint();
}
else if(G_choice =="2")
{
G_modifyThePoint();
}
else if(G_choice == "3")
{
G_change_PIN();
}
else if(G_choice == "0")
{
cout<<"正在退出系统..."<<endl;
Sleep(2000);
save();
return;
}
else
{
cout<< "请正确输入!" <<endl;
Sleep(2000);
system("cls");
}
system("pause");
system("cls");
}
while(G_choice!="0");
}
}
else if(choice_main == "2")
{

Sleep(2000);
system("cls");

do
{
Y_menu();
cin>>Y_choice;

if(Y_choice == "0")
{
cout<<"正在退出系统..."<<endl;
Sleep(2000);
save();
return;
}
else if(Y_choice =="1")
{

menu_point();
shortPath();
}
else if(Y_choice == "2")
{

menu_point();
viewThePoint();
}

else
{
cout<<"请您正确选择功能"<<endl;

}

system("pause");
system("cls");
}
while(Y_choice!="0");
}
else
{
cout <<"请正确选择"<<endl;
Sleep(2000);
system("cls");
}
}
while(choice_main !="2" && choice_main !="1");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: