Dynamic Programming

// ConsoleApplication43.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "string"
#include "sstream"
#include "cmath"


using namespace std;

struct islands
{
	int x;
	int y;
};

class route
{
public:
	int numi;
	float E;

	route();
	route(int n, float e);

	islands *isd;
	bool *con;
	int **distmatrix;
	long sum;
	void addislands(int coor, int num, char c);
	void printoutislands();
	void printoutdistmatrix();
	void compdistmat();
	void connected();
	void getsum();
	bool allcon();
	void solution();

	~route()
	{
		delete[] isd;
		delete[] con;
		for (int i = 0; i < numi; i++)
			delete[] distmatrix[i];
		delete[] distmatrix;
	}

	islands start;
};

void route::addislands(int coor, int num, char c)
{
	if (c == 'x')
	{
		isd[num].x = coor;
	}
	else
	{
		isd[num].y = coor;
		con[num] = 0;
	}
};

route::route(int n,float e)
{
	this->numi = n;
	this->E = e;
	isd = new islands[n];
	con = new bool[n];
}

void route::printoutislands()
{
	for (int i = 0; i < numi; i++)
	{
		cout << isd[i].x << " ~ " << isd[i].y << endl;
	}
}

void route::printoutdistmatrix()
{
	for (int i = 0; i < numi; i++)
	{
		for (int j = 0; j < numi; j++)
		{
			cout << distmatrix[i][j] << " ";
		}
		cout << endl;
	}
}

void route::compdistmat()
{
	distmatrix = new int*[numi];
	for (int i = 0; i < numi; i++)
	{
		distmatrix[i] = new int[numi];
		for (int j = 0; j < numi; j++)
		{
			distmatrix[i][j] = sqrt(pow((isd[i].x - isd[j].x), 2) + pow((isd[i].y-isd[j].y), 2));
		}
	}
}

void route::connected()
{
	con[0] = 1;

	for (int i = 1; i < numi; i++)
	{
		con[i] = false;
	}

	bool change = 0;

	do{
		change = 0;

		for (int i = 0; i < numi; i++)
		{
			for (int j = 0; j < numi; j++)
			{
//				cout << i << j << con[i] <<con[j] << endl;
				if ((i != j) && (con[i] == 1) && (distmatrix[i][j] != INT_MAX))
				{
					if (con[j] == 0)
					{
					change = 1;
//					cout << "changed" << endl;
					}
					con[j] = true;
				}
//				cout << i << j <<con[i]<< con[j] << endl;
			}
//			cout << con[0] << con[1] << con[2] << con[3] << endl;
//			cout << "----" << endl;
		}
	} while (change);
}

bool route::allcon()
{
	connected();
	bool flag = 1;

	for (int i = 0; i < numi; i++)
	{
		if (con[i] == 0)
			flag = 0;
	}
	
	return flag;
}

void route::getsum()
{
	sum=0;
	for (int i = 0; i < numi; i++)
	{
		for (int j = i; j < numi; j++)
		{
			if ((i != j)&& (distmatrix[i][j] != INT_MAX))
				sum=sum+distmatrix[i][j];
		}
	}
	sum = sum*E;
}

void route::solution()
{
	//get first solution
	for (int i = 0; i < numi; i++)
	{
		for (int j = i + 1; j < numi; j++)
		{
			if (j < numi)
			{
				int tmp = distmatrix[i][j];
				distmatrix[i][j] = INT_MAX;
				distmatrix[j][i] = INT_MAX;
				if (!allcon())
				{
					distmatrix[i][j] = tmp;
					distmatrix[j][i] = tmp;
				}
			}
			printoutdistmatrix();
			cout << "----" << endl;
		}
	}



}

int _tmain(int argc, _TCHAR* argv[])
{
	int numi;
	float E;
//	cin >> numi;
//	cin.ignore();
	numi = 4;
	string linex;
	string liney;
	string tmp;

	//cin >> linex;
	//cin.ignore();
	//cin >> liney;
	//cin.ignore();

//sample input

	linex = "0 0 400 400";
	liney = "0 100 0 100";
	
	//	cin >> E;
	//	cin.ignore();
	E = 1.0;

	route myroute(numi,E);

	istringstream strx(linex);
	int counter = 0;
	while (getline(strx, tmp, ' '))
	{
		int x = atoi(tmp.c_str());
//		cout << x << endl;
		myroute.addislands(x,counter,'x');
		counter++;
	}

	counter = 0;
	istringstream stry(liney);
	while (getline(stry, tmp, ' '))
	{
		int y = atoi(tmp.c_str());
//		cout << y << endl;
		myroute.addislands(y, counter, 'y');
		counter++;
	}

	myroute.compdistmat();
	myroute.printoutislands();
	myroute.printoutdistmatrix();
	myroute.solution();
	myroute.getsum();

	cout << myroute.sum<<endl;

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值