poj1178Camelot(floyd最短路算法+枚举)

原创 2016年05月31日 17:41:53

因为是8×8的方格,所以枚举终点位以及亚瑟王与骑士相遇的相遇位,floyd求一下最短路,最后去一下那个遇到亚瑟王的骑士的重复步数。

恩……刚开始没有思路……用DP没有做出来……(╯﹏╰)然后看了其他用枚举的思路……(づ。◕‿‿◕。)づ

我会好好记住的!!

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>

using namespace std;

int kmove[8][2]={{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};
int knmove[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
const int inf=100000000;
int kmap[64][64];
int knmap[64][64];
int i,j;

bool ok(int x,int y)  //判断位置的正确性
{
	if(x>=0&&x<8&&y>=0&&y<8) return true;
	else return false;
}

void getxy(int p,int &x,int &y)  //得出坐标
{
	x=p%8;
	y=p/8;
}

int getPosition(int x,int y) //得出数字位置
{
	return x+y*8;
}


void init()  //初始化
{
	for(int i=0;i<64;++i)
	{
		for(int j=0;j<64;++j)
		{kmap[i][j]=inf;knmap[i][j]=inf;}

		kmap[i][i]=0;
		knmap[i][i]=0;

		int x,y,tx,ty;
		int next;

		getxy(i,x,y);

		for(j=0;j<8;++j)
		{
			tx=kmove[j][0]+x;
			ty=kmove[j][1]+y;
			if(ok(tx,ty))
			{
				next=getPosition(tx,ty);
				kmap[i][next]=1;
			}

			tx=knmove[j][0]+x;
			ty=knmove[j][1]+y;
			if(ok(tx,ty))
			{
				next=getPosition(tx,ty);
				knmap[i][next]=1;
			}
		}
	}
}

void floyd()    //最短路
{
	for(int k=0;k<64;++k)
		for(int i=0;i<64;++i)
			for(int j=0;j<64;++j)
			{
				kmap[i][j]=kmap[i][j]<(kmap[i][k]+kmap[k][j])?kmap[i][j]:(kmap[i][k]+kmap[k][j]);
				knmap[i][j]=knmap[i][j]<(knmap[i][k]+knmap[k][j])?knmap[i][j]:(knmap[i][k]+knmap[k][j]);
			}
}

int main()
{
	string s;
	int num,size,minmove,sum;
	int position[64];

	init();
	floyd();

	cin>>s;
	size=s.size();
	num=0;

	for(int i=0;i<size;i+=2)
		position[num++]=s[i]-'A'+(s[i+1]-'1')*8;

	minmove=inf;
	for(int ds=0;ds<64;++ds) //最终位
		for(int m=0;m<64;++m) //相遇位
			for(int k=1;k<num;++k)  //相遇骑士
			{
				sum=0;
				for(int i=1;i<num;++i) sum+=knmap[position[i]][ds];//骑士到达终点位步数
				sum+=kmap[position[0]][m]; //国王到相遇位步数
				sum+=knmap[position[k]][m]+knmap[m][ds];  //骑士k于相遇位到最终位的步数
				sum-=knmap[position[k]][ds];  //减去k骑士多算的一次
				if(sum<minmove) minmove=sum;
			}
	printf("%d\n",minmove);
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

最短路算法之Floyd算法

时间:2016/5/6(day6) 目标算法:Floyd算法 应用范围:最短路 算法思路:动态规划的思想,从设有三点i,j,k,从I到k分为两种方法,一种为从i直接到k,另外一种是从I到j再到k。所以...
  • Sara_YF
  • Sara_YF
  • 2016年05月07日 01:04
  • 332

最短路算法之Floyd

一,基本思路:
  • juanlansexuehua
  • juanlansexuehua
  • 2017年03月18日 20:11
  • 106

最短路 - floyd 【 理解 + 例题 】 更新 ing...

看着巨巨们越来越牛逼,
  • xi__long
  • xi__long
  • 2014年08月21日 22:47
  • 837

MATLAB Floyd算法求最短路

在该算法中,我们用邻接矩阵的形式来存储该图。 因为在本次建模过程中,我们已经把数据输入到excel中, 而matlab是可以编程来读取excel和写入excel的。若你的图的 邻接矩阵在txt中,也可...
  • SY_Yu
  • SY_Yu
  • 2016年01月26日 17:14
  • 4401

图论-最短路-Dijkstra算法&Floyd算 c++

最短路径解决了求解一个图中两顶点之间最短的路径问题。其中Dijkstra算法应用贪心法求解单源点到其余各点的最短路径问题;而Floyd算法则解决了图中任意两点间的最短路径问题。...
  • u011493860
  • u011493860
  • 2013年08月17日 19:58
  • 964

最短路算法,matlab程序

%我自己写的一个最短路算法,matlab程序(过去写的,在我的百度空间上面也有)clear; clc; M=1000; a(1,:)=[0,50,M,40,25,10]; a(2,:)=[zeros(...
  • xcli25
  • xcli25
  • 2007年05月03日 19:00
  • 966

Floyd最短路算法

坐在马桶上看算法:只有五行的Floyd最短路算法 2014-03-26 09:04 ahalei 51CTO博客 我要评论(0) 字号:T | T 此算法由Robert W...
  • u013443618
  • u013443618
  • 2015年10月13日 16:07
  • 275

最短路算法(Floyd)

Floyd算法又称为,插点法,是一种用于寻找给定的加权图中多源点之间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。...
  • u013021513
  • u013021513
  • 2014年11月04日 14:08
  • 306

最短路算法(Floyd)

HDU 2544 用作测试模板是否正确 #include const int inf = 0xfffff; const int N = 510; int dis[N][N]; void ini...
  • joy_go
  • joy_go
  • 2012年12月04日 20:00
  • 324

最短路-四种算法复杂度分析比较 HDU-1874 畅通工程

样例解析: 每组数据第一行包含两个正整数N和M(0#include #include #include using namespace std; const int inf = 1...
  • jichangzhen
  • jichangzhen
  • 2016年08月21日 11:24
  • 984
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj1178Camelot(floyd最短路算法+枚举)
举报原因:
原因补充:

(最多只允许输入30个字)