⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dijkstra_taview.cpp

📁 数据结构的经典实验程序。以全国主要城市为图的顶点, 铁路连接为图的边, 距离作为加权, 设计完成一个最短路径自动查找系统;输入为出发城市和目标城市, 输出为最短路径和距离。
💻 CPP
字号:
// Dijkstra_TAView.cpp : implementation of the CDijkstra_TAView class
//

#include "stdafx.h"
#include "Dijkstra_TA.h"

#include "Dijkstra_TADoc.h"
#include "Dijkstra_TAView.h"

#include "Citymap.h"

#include "Dialoginput.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#ifndef N
#define N 15
#endif
#ifndef NoEdge
#define NoEdge 65535
#endif

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView

IMPLEMENT_DYNCREATE(CDijkstra_TAView, CView)

BEGIN_MESSAGE_MAP(CDijkstra_TAView, CView)
	//{{AFX_MSG_MAP(CDijkstra_TAView)
	ON_COMMAND(ID_MENU_SHOWMAP, OnMenuShowmap)
	ON_COMMAND(ID_MENU_DIJKSTRA, OnMenuDijkstra)
	ON_COMMAND(ID_MENU_SHOWRTRAIN, OnMenuShowrtrain)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView construction/destruction

CDijkstra_TAView::CDijkstra_TAView()
: isshowtravel(false)
{
	// TODO: add construction code here
	isshowmap=false;
	isshowtravel=false;
	isshowtrainroad=false;
	for(int i=0;i<15;i++)
		m_travel[i]=-1;
}

CDijkstra_TAView::~CDijkstra_TAView()
{
}

BOOL CDijkstra_TAView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView drawing

void CDijkstra_TAView::OnDraw(CDC* pDC)
{
	CDijkstra_TADoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here

	CClientDC dc(this);
	CClientDC * pdc=&dc;
	if(isshowmap)
	{
		CBitmap Bcitymap;//创建BITMAP类的实例,并导入资源
		Bcitymap.LoadBitmap(IDB_BITMAP1);
		CDC mapDC;//显示资源在当前设备上
		mapDC.CreateCompatibleDC(pDC);
		mapDC.SelectObject(&Bcitymap);
		pDC->BitBlt(0,0,750,560,&mapDC,0,0,SRCCOPY);
		//////////

		///////显示主要城市的地名////////

		DrawCityName(pdc);
		////////在地图上描绘出主要城市////////
		DrawCityPosition(pdc);

	}
	if(isshowtravel)
	{
		Showtravel(pdc);
	}
	if(isshowtrainroad)
	{
		DrawCityRoad(pdc);
	}

}

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView printing

BOOL CDijkstra_TAView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDijkstra_TAView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDijkstra_TAView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView diagnostics

#ifdef _DEBUG
void CDijkstra_TAView::AssertValid() const
{
	CView::AssertValid();
}

void CDijkstra_TAView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDijkstra_TADoc* CDijkstra_TAView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDijkstra_TADoc)));
	return (CDijkstra_TADoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDijkstra_TAView message handlers


void CDijkstra_TAView::OnMenuShowmap() 
{
	// TODO: Add your command handler code here
	isshowmap=true;
	Invalidate(true);
	//isshowmap=false;
	isshowtravel=false;
	isshowtrainroad=false;

}


void CDijkstra_TAView::OnMenuDijkstra() 
{
	// TODO: Add your command handler code here
	isshowtravel=true;
	isshowtrainroad=false;

	for(int i=0;i<15;i++)
		m_travel[i]=-1;


	CDialoginput dialog;
	dialog.DoModal();
	m_startcityindex=ChangeNameToIndex(dialog.m_startcity);
	m_goalcityindex=ChangeNameToIndex(dialog.m_goalcity);
	//报错检查
	if(m_startcityindex==-1||m_goalcityindex==-1){
		AfxMessageBox("城市名称拼音输入有错误,请重新输入!",MB_ICONINFORMATION);
			isshowtrainroad=false;
		return;
	}

	//输出制定城市的最短路径
	m_citymap.ShortPath(m_travel,m_startcityindex,m_goalcityindex);
	//m_citymap.ShortPath(m_travel,0,12);
	Invalidate(true);
}

void CDijkstra_TAView::DrawCityName(CClientDC *pdc)	// 地图左边显示城市列表
{
		int i=10;
		pdc->TextOut(780,i,     "城市名");      //  拼音  ");
		pdc->TextOut(780,i=i+18,"北京 ");      //  beijing");
		pdc->TextOut(780,i=i+18,"哈尔滨");    // haerbin");
		pdc->TextOut(780,i=i+18,"呼和浩特");   //huhehaote");
		pdc->TextOut(780,i=i+18,"乌鲁木齐");  // wulumuqi");
		pdc->TextOut(780,i=i+18,"上海");       //  shanghai");
		pdc->TextOut(780,i=i+18,"郑州");       //  zhengzhou");
		pdc->TextOut(780,i=i+18,"长沙");       //   changsha");
		pdc->TextOut(780,i=i+18,"广州");       //   guangzhou");
		pdc->TextOut(780,i=i+18,"福州");        //  fuzhou");
		pdc->TextOut(780,i=i+18,"南京");       //  nanjing");
		pdc->TextOut(780,i=i+18,"西安");       //   xian");
		pdc->TextOut(780,i=i+18,"兰州");        //  lanzhou");
		pdc->TextOut(780,i=i+18,"重庆");       //   chongqing");
		pdc->TextOut(780,i=i+18,"长春");
		pdc->TextOut(780,i=i+18,"南昌");
		//pdc->TextOut(780,i=i+18,"北京          nanjing");
}

// //在地图上显示最短路径函数
void CDijkstra_TAView::Showtravel(CClientDC * pdc)
{
		COLORREF m_Color=RGB(0,0,255);
		CPen Pen;
		Pen.CreatePen(0,3, m_Color);	// 生成笔
		pdc->SelectObject(&Pen);		
		int i=0;
		for(i=0;i<N;i++){
			if(m_travel[i]!=-1&&m_travel[i+1]!=-1){
				pdc->MoveTo(m_citymap.m_ChinaMainCity[m_travel[i]].pointx,m_citymap.m_ChinaMainCity[m_travel[i]].pointy);
				pdc->LineTo(m_citymap.m_ChinaMainCity[m_travel[i+1]].pointx,m_citymap.m_ChinaMainCity[m_travel[i+1]].pointy);			
			}
		}
		i=0;
		pdc->TextOut(10,570,"最近的路径是: ");
		m_cityname=ChangeIndexToName(m_travel[i]);
		pdc->TextOut(130,570,m_cityname);
		int j=145;
		for(i=1;i<N;i++)
			if(m_travel[i]!=-1){
				m_cityname=ChangeIndexToName(m_travel[i]);
				j=j+60;
				pdc->TextOut(j,570,"<--->");
				j=j+45;
				pdc->TextOut(j,570,m_cityname);
				
			}
		//pdc->TextOut(30,570,"铁路线全长是: ");
}

// 显示城市的位置,采用重新描绘的方式
void CDijkstra_TAView::DrawCityPosition(CClientDC* pdc)
{
		COLORREF m_Color=RGB(255,0,0);
		CPen Pen;
		Pen.CreatePen(0,3, m_Color);	// 生成笔
		pdc->SelectObject(&Pen);
		int i=0;
		for(i=0;i<N;i++)//draw the cites position
			pdc->Ellipse(m_citymap.m_ChinaMainCity[i].pointx-3,m_citymap.m_ChinaMainCity[i].pointy-3,m_citymap.m_ChinaMainCity[i].pointx+3,m_citymap.m_ChinaMainCity[i].pointy+3);

}

int CDijkstra_TAView::ChangeNameToIndex(CString cityname)
{
	//int Compare( LPCTSTR lpsz ) const;
	//Return Value
	//Zero if the strings are identical, 
	//< 0 if this CString object is less than lpsz, 
	//or > 0 if this CString object is greater than lpsz.
	int value;
	//if(!cityname.Compare("beijing"))value=0;
	if(!cityname.Compare("北京"))value=0;
	else if(!cityname.Compare("哈尔滨"))value=1;
	else if(!cityname.Compare("呼和浩特"))value=2;
	else if(!cityname.Compare("乌鲁木齐"))value=3;
	else if(!cityname.Compare("上海"))value=4;
	else if(!cityname.Compare("郑州"))value=5;
	else if(!cityname.Compare("长沙"))value=6;
	else if(!cityname.Compare("广州"))value=7;
	else if(!cityname.Compare("福州"))value=8;
	else if(!cityname.Compare("南京"))value=9;
	else if(!cityname.Compare("西安"))value=10;
	//else if(!cityname.Compare("lanzhou"))value=11;
	else if(!cityname.Compare("兰州"))value=11;
	else if(!cityname.Compare("重庆"))value=12;
	else if(!cityname.Compare("长春"))value=13;
	else if(!cityname.Compare("南昌"))value=14;
	//else if(!cityname.Compare(" "))value=;
	else value=-1;

	return value;
}
CString CDijkstra_TAView::ChangeIndexToName(int index)
{
	CString name;
	switch(index){
	case 0:{name="北京";break;}
	case 1:{name="哈尔滨";break;}
	case 2:{name="呼和浩特";break;}
	case 3:{name="乌鲁木齐";break;}
	case 4:{name="上海";break;}
	case 5:{name="郑州";break;}
	case 6:{name="长沙";break;}
	case 7:{name="广州";break;}
	case 8:{name="福州";break;}
	case 9:{name="南京";break;}
	case 10:{name="西安";break;}
	case 11:{name="兰州";break;}
	case 12:{name="重庆";break;}
	case 13:{name="长春";break;}
	case 14:{name="南昌";break;}
	default:name="未知城市";
	}
	return name;
}

//////////////////////////
/*
beijing

haerbin

huhehaote

wulumuqi

shanghai

zhengzhou

changsha

guangzhou

fuzhou

nanjing

xian

lanzhou

chongqing

*/

void CDijkstra_TAView::OnMenuShowrtrain() 
{
	// TODO: Add your command handler code here
	isshowtrainroad=true;
	isshowtravel=false;

	Invalidate(true);
}

void CDijkstra_TAView::DrawCityRoad(CClientDC *pdc)
{
		COLORREF m_Color=RGB(255,0,0);
		CPen Pen;
		Pen.CreatePen(0,3, m_Color);	// 生成笔
		pdc->SelectObject(&Pen);
		for(int i=0;i<N;i++)//draw the road between cities
			for(int j=0;j<N;j++)
				if(m_citymap.m_road_city[i][j]!=NoEdge){
				pdc->MoveTo(m_citymap.m_ChinaMainCity[i].pointx,m_citymap.m_ChinaMainCity[i].pointy);
				pdc->LineTo(m_citymap.m_ChinaMainCity[j].pointx,m_citymap.m_ChinaMainCity[j].pointy);			
			}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -