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

📄 clsmap8db.h

📁 最小生成树的算法范例
💻 H
字号:
/*
;=============================================================================
; 名称:clsMAP8dB
;=============================================================================
; 描述:地图综合
;=============================================================================
*/
#define MAP_obstacle 'X'          //地图文件障碍标志
#define MAP_startSign 's'         //地图文件起点标志
#define MAP_finishSign 'f'        //地图文件终点标志
#define MAP_path_show '+'         //地图显示时的路径标志
#define MAP_obstacle_show 'X'     //地图显示时的障碍标志
#define MAP_passable_show ' '     //地图显示时的通行标志
#define MAP_start_point_show 's'  //地图显示时的起点标志
#define MAP_finish_point_show 'f' //地图显示时的终点标志

class clsMAP8dB{
public:
	clsNODE *start_point;                  //指向起点类的指针
	clsNODE *finish_point;                 //记录终点类的指针
	int x_size;                            //地图的宽,表示格的个数,从1起
	int y_size;                            //地图的高,表示格的个数,从1起

	int passable(clsNODE *, int);          //判断地图是否通行,通行则返回1,不通行返回0
	void display();                        //输出地图
	void InputMapFile(string mapFILENAME); //设置地图文件名并提取入临时变量同时执行转制
	vector<vector<clsNODE *> > mapData;    //地图数据,1为障碍,0为通行
	void ShowPath(typePATH);               //让地图显示路径
private:
	vector<string> mapTEMP;                //临时存储地图变量,存放字符串地图
	void MapConvert();                     //地图数字化
};
//-----------------------------------------------------------------------------
// 名称:InputMapFile
// 功能:提取地图文件
//-----------------------------------------------------------------------------
void clsMAP8dB::InputMapFile(string mapFILENAME){
	ifstream mapFILE(mapFILENAME.c_str());
	string strTEMP;
	while(mapFILE.eof() == NULL){
		mapFILE>>strTEMP;
		//当前行不为空才加入地图数据中
		if(strTEMP[0]){
		    mapTEMP.push_back(strTEMP);
			strTEMP = "";
		}
	}
	mapFILE.close();
	MapConvert();    //转换字符串为数字格式,并存入数据
}
//-----------------------------------------------------------------------------
// 名称:MapConvert
// 功能:转换临时字符串为整形地图数据同时转制,1为障碍,0为通行
//-----------------------------------------------------------------------------
void clsMAP8dB::MapConvert(){
	unsigned int i, j = 0;
	char temp;
	vector<clsNODE *> mapLINE;
	clsNODE *p_clsNODE;
	for(i = 0; i < mapTEMP[0].length(); i++){
		mapLINE.clear();
		for(j = 0; j < mapTEMP.size(); j++){
			temp = mapTEMP[j][i];
			switch(temp){
			case MAP_obstacle :        //设置地图障碍
				p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
				p_clsNODE->x = i;
				p_clsNODE->y = j;
				p_clsNODE->Flag = 1;
				mapLINE.push_back(p_clsNODE);
				break;
			case MAP_startSign :       //设置地图起点
				p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
				p_clsNODE->x = i;
				p_clsNODE->y = j;
				p_clsNODE->Flag = 0;
				start_point = p_clsNODE;
				mapLINE.push_back(p_clsNODE);
				break;
			case MAP_finishSign :      //设置地图终点
				p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
				p_clsNODE->x = i;
				p_clsNODE->y = j;
				p_clsNODE->Flag = 0;
				finish_point = p_clsNODE;
				mapLINE.push_back(p_clsNODE);
				break;
			default :                  //设置地图通行
				p_clsNODE = (clsNODE *)malloc(sizeof(clsNODE));
				p_clsNODE->x = i;
				p_clsNODE->y = j;
				p_clsNODE->Flag = 0;
				mapLINE.push_back(p_clsNODE);
			}
		}
		mapData.push_back(mapLINE);
	}
	x_size = mapData.size();
	y_size = mapData[0].size();

}
/*
//-----------------------------------------------------------------------------
// 名称:display
// 功能:输出地图
//-----------------------------------------------------------------------------
void clsMAP8dB::display(){
    int i, j;
	//输出地图边框
	for(i = 0; i < x_size + 2; i++)
		cout<<MAP_obstacle_show;
	cout<<endl;
	for(i = 0; i < y_size; i++){
		//输出地图边框
		cout<<MAP_obstacle_show;
		for(j = 0; j < x_size; j++){
			switch(mapData[j][i]->Flag){
			case 0 :
				if((j == start_point->x) && (i == start_point->y))
					cout<<MAP_start_point_show;
				else if((j == finish_point->x) && (i == finish_point->y))
					cout<<MAP_finish_point_show;
				else
					cout<<MAP_passable_show;
				break;
			case 1 :
				if((j == start_point->x) && (i == start_point->y))
					cout<<MAP_start_point_show;
				else if((j == finish_point->x) && (i == finish_point->y))
					cout<<MAP_finish_point_show;
				else
				    cout<<MAP_obstacle_show;
				break;
			}
		}
		//输出地图边框
		cout<<MAP_obstacle_show<<endl;;
	}
	//输出地图边框
	for(i = 0; i < x_size + 2; i++)
		cout<<MAP_obstacle_show;
	cout<<endl;
	cout<<"起点坐标=("<<start_point->x<<","<<start_point->y<<")"<<endl;
	cout<<"终点坐标=("<<finish_point->x<<","<<finish_point->y<<")"<<endl;
}
//-----------------------------------------------------------------------------
// 名称:ShowPath
// 功能:输出地图路径
//-----------------------------------------------------------------------------
void clsMAP8dB::ShowPath(typePATH path){
	int i, j;
	clsNODE *now_p = start_point;
	vector<vector<clsNODE *> > show_map_data;
	show_map_data = mapData;
	//将路径加入临时地图
	show_map_data[now_p->x][now_p->y]->Flag = -1;
	for(i = 0; i < path.size(); i++){
		switch(path[i]){
		case 1 :
			now_p = show_map_data[now_p->x - 1][now_p->y + 1];
			break;
		case 2 :
			now_p = show_map_data[now_p->x][now_p->y + 1];
			break;
		case 3 :
			now_p = show_map_data[now_p->x + 1][now_p->y + 1];
			break;
		case 4 :
			now_p = show_map_data[now_p->x - 1][now_p->y];
			break;
		case 6 :
			now_p = show_map_data[now_p->x + 1][now_p->y];
			break;
		case 7 :
			now_p = show_map_data[now_p->x - 1][now_p->y - 1];
			break;
		case 8 :
			now_p = show_map_data[now_p->x][now_p->y - 1];
			break;
		case 9 :
			now_p = show_map_data[now_p->x + 1][now_p->y - 1];
			break;
		}
		show_map_data[now_p->x][now_p->y]->Flag = -1;
	}
	//输出地图+路径
	for(i = 0; i < x_size + 2; i++)
		//输出地图边框
		cout<<MAP_obstacle_show;
	cout<<endl;
	for(i = 0; i < y_size; i++){
		//输出地图边框
		cout<<MAP_obstacle_show;
		for(j = 0; j < x_size; j++){
			switch(show_map_data[j][i]->Flag){
			case -1 :
				cout<<MAP_path_show;
				break;
			case 1:
				cout<<MAP_obstacle_show;
				break;
			default :
				cout<<MAP_passable_show;
			}
		}
		//输出地图边框
		cout<<MAP_obstacle_show<<endl;
	}
	//输出地图边框
	for(i = 0; i < x_size + 2; i++)
		cout<<MAP_obstacle_show;
	cout<<endl;
}
*/
//-----------------------------------------------------------------------------
// 名称:passable
// 功能:判断从某一点沿某方向行走一格是否通行,通行返回1,不通行返回0
//       需传递坐标,方向
//-----------------------------------------------------------------------------
int clsMAP8dB::passable(clsNODE *p_point, int direction){
	int x = p_point->x,	y = p_point->y;
	switch(direction){
	case 2 :
		if((y + 1 <= y_size - 1) && (mapData[x][y + 1]->Flag != 1))
			return 1;
		break;
	case 4 :
		if((x - 1 >= 0) && (mapData[x - 1][y]->Flag != 1))
			return 1;
		break;
	case 6 :
		if((x + 1 <= x_size - 1) && (mapData[x + 1][y]->Flag != 1))
			return 1;
		break;
	case 8 :
		if((y - 1 >= 0) && (mapData[x][y - 1]->Flag != 1))
			return 1;
		break;
	case 1 :
		if((x - 1 >= 0) && (y + 1 <= y_size - 1) && (mapData[x - 1][y + 1]->Flag != 1)
		  && ((mapData[x][y + 1]->Flag != 1) && (mapData[x - 1][y]->Flag != 1)))
			return 1;
		break;
	case 3 :
		if((x + 1 <= x_size - 1) && (y + 1 <= y_size - 1) && (mapData[x + 1][y + 1]->Flag != 1)
		  && ((mapData[x][y + 1]->Flag != 1) && (mapData[x + 1][y]->Flag != 1)))
			return 1;
		break;
	case 7 :
		if((x - 1 >= 0) && (y - 1 >= 0) && (mapData[x - 1][y - 1]->Flag != 1)
		  && ((mapData[x][y - 1]->Flag != 1) && (mapData[x - 1][y]->Flag != 1)))
			return 1;
		break;
	case 9 :
		if((x + 1 <= x_size - 1) && (y - 1 >= 0) && (mapData[x + 1][y - 1]->Flag != 1)
		  && ((mapData[x][y - 1]->Flag != 1) && (mapData[x + 1][y]->Flag != 1)))
			return 1;
		break;
	default :
		return 0;
	}
	return 0;
}

⌨️ 快捷键说明

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