蒜头君得到一张藏宝图。藏宝图是一个 10×10 的方格地图,图上一共有 10 个宝藏。有些方格地形太凶险,不能进入。

整个图只有一个地方可以出入,即是入口也是出口。蒜头君是一个贪心的人,他规划要获得所有宝藏以后才从出口离开。

1

1 天的时间,蒜头君从入口出发,找到所有宝藏以后,回到出口,最少需要多少天。


算是用暴力吧,先把出口和这10个宝藏从0~10编一下号,然后在建立这11个的最短距离的无向图。;

接着全排列这除了出口的的10个宝藏的先后顺序。这个顺序就是我们寻找宝藏的顺序,接着我们计算这次需要用到的的时间

并更新它就行了

答案是48

代码如下

#include<stdio.h>
#include<algorithm> 
#include<string.h>
#include<queue>

using namespace std;

struct node
{
	int x, y, step;
};

int data[11][11] = {0}; 

int number[11][2];

int disnumber[11][11], map1[11][11], vis[11][11] = {0};

int dir[4][2] = {1,0,0,1,-1,0,0,-1};

void init();

int bfs(int mark)
{
	int x = number[mark][0], y = number[mark][1];
	
	queue <node> que;
	
	node start; start.x = x, start.y = y, start.step = 0;
	
	que.push(start);
	
	memset(vis,0,sizeof(vis));
	
	vis[x][y] = 1;
	
	map1[mark][mark] = 0;
	
	while(!que.empty())
	{
		node now = que.front();
		
		
		if(data[now.x][now.y]==1)
		map1[mark][disnumber[now.x][now.y]] = now.step;
		
		for(int i=0; i < 4; i++)
		{
			int nx = now.x + dir[i][0];
			
			int ny = now.y + dir[i][1];
			
			if(vis[nx][ny] == 0 && nx >=1 && nx <=10 && ny >=1 && ny <= 10 && data[nx][ny] != 2)
			{
				vis[nx][ny] = 1;
				
				node temp ;
				
				temp.x = nx, temp.y = ny, temp.step = now.step + 1;
				
				que.push(temp);
			}
		}
		
		que.pop();
	} 
	
	return 0;
	
}

int main()
{
	init();
	
	for(int i = 1; i <= 10; i++)
	{
		for(int j = 1; j <= 10; j++)
		printf("%d ",data[i][j]);
		printf("\n");
	}
	
	for(int i = 0; i <=10; i++)
	{
		bfs(i);
	}
	
	for(int i = 0; i <= 10; i++)
	{
		for(int j = 0;j <=10; j++)
		printf("%d ",map1[i][j]);
		printf("\n");
	}
	int combination[11];
	for(int i=0;i<=10;i++)
	combination[i]=i;
	int sum  = 9999999;
	int id=0;
	  do 
	  {
	  	int temp_sum=0;
	  	for(int i = 1; i <= 10; i++)
	  	{
	  		temp_sum += map1[combination[i-1]][combination[i]];
	  	}
	  	temp_sum +=map1[combination[10]][0];
	  	if(sum>temp_sum)
	  	{
	  	sum=temp_sum;
	  	} 
	  	
	  }while(next_permutation(combination+1,combination+11));
	  printf("%d\n",sum);
	
	
	
	return 0;
}

void init()
{
	data[1][8]=data[2][7]=data[3][5]=data[4][2]=data[4][9]=data[5][5]=data[7][9]=data[8][7]=data[9][2]=data[10][7]=data[1][1]=1;
	data[2][4]=data[3][2]=data[3][8]=data[4][6]=data[5][2]=data[5][7]=data[6][3]=data[6][8]=data[7][6]=data[8][2]=data[8][4]=data[9][7]=data[9][8]=data[10][3]=data[10][6]=2;
	number[1][0]=1,number[1][1]=8,number[2][0]=2,number[2][1]=7,number[3][0]=3,number[3][1]=5;
	number[4][0]=4,number[4][1]=2,number[5][0]=4,number[5][1]=9,number[6][0]=number[6][1]=5;
	number[7][0]=7,number[7][1]=9,number[8][0]=8,number[8][1]=7,number[9][0]=9,number[9][1]=2,number[0][0]= 1,number[0][1]=1;
	number[10][0]=10,number[10][1]=7;
	
	for(int i=0;i<=10;i++)
	{
		disnumber[number[i][0]][number[i][1]]=i;
	}
}