pku2907.cpp

来自「这是ACM 方面的资料 是PKU的 北京大学的出来的」· C++ 代码 · 共 66 行

CPP
66
字号
#include <stdio.h>
#include <string.h>
#define INF 100000000

typedef struct Point
{
	int x, y;
}Point;

Point p[10];
int N, X, Y;
int d[10][10];
int v[10];
int min;

int abs(int x) {return x > 0 ? x : -x;}
int dis(const Point &a, const Point &b){return abs(a.x - b.x) + abs(a.y - b.y);}

void DFS(int p, int sum, int k)
{
	int i;
	if (sum >= min || (p == 0 && k != N))
		return;
	if (k == N && p == 0)
	{
		if (sum < min)
			min = sum;
		return;
	}
	v[p] = 1;
	for (i = 0; i <= N; i++)
	{
		if (!v[i])
			DFS(i, sum + d[i][p], k + 1);
	}
	v[p] = 0;
}

void Solve()
{
	int i, j;
	scanf("%d %d", &X, &Y);
	scanf("%d %d", &p[0].x, &p[0].y);
	scanf("%d", &N);
	for (i = 1; i <= N; i++)
		scanf("%d %d", &p[i].x, &p[i].y);
	for (i = 0; i <= N; i++)
		for (j = 0; j <= N; j++)
			d[i][j] = dis(p[i], p[j]);
	memset(v, 0, sizeof(v));
	min = INF;
	for (i = 1; i <= N; i++)
		DFS(i, d[i][0], 0);
	printf("The shortest path has length %d\n", min);
}

int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
		Solve();
	return 0;
}

⌨️ 快捷键说明

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