using
System;
using
System.Collections.Generic;
public
class
Pair {
public
int
x;
public
int
y;
public
Pair(
int
x,
int
y)
{
this
.x = x;
this
.y = y;
}
}
public
class
GFG {
static
int
CalculateDistance(Pair a, Pair b)
{
return
Math.Abs(a.x - b.x) + Math.Abs(a.y - b.y);
}
static
int
FindMinDistanceUtil(List<
int
> nodes,
int
noOfCustomers,
int
[, ] matrix)
{
int
minDistance =
int
.MaxValue;
int
[] perm =
new
int
[nodes.Count];
for
(
int
i = 0; i < nodes.Count; i++) {
perm[i] = nodes[i];
}
do
{
int
distance = 0;
int
prev = 1;
for
(
int
i = 0; i < noOfCustomers; i++) {
distance = distance + matrix[prev, perm[i]];
prev = perm[i];
}
distance = distance + matrix[prev, 0];
if
(distance < minDistance) {
minDistance = distance;
}
}
while
(NextPermutation(perm));
return
minDistance;
}
static
bool
NextPermutation(
int
[] perm)
{
int
i = perm.Length - 2;
while
(i >= 0 && perm[i] >= perm[i + 1]) {
i--;
}
if
(i == -1) {
return
false
;
}
int
j = perm.Length - 1;
while
(perm[j] <= perm[i]) {
j--;
}
Swap(perm, i, j);
Reverse(perm, i + 1);
return
true
;
}
static
void
Reverse(
int
[] perm,
int
start)
{
int
i = start, j = perm.Length - 1;
while
(i < j) {
Swap(perm, i, j);
i++;
j--;
}
}
static
void
Swap(
int
[] perm,
int
i,
int
j)
{
int
temp = perm[i];
perm[i] = perm[j];
perm[j] = temp;
}
static
void
FindMinDistance()
{
int
noOfCustomers = 1;
List<Pair> coordinates =
new
List<Pair>();
List<
int
> nodes =
new
List<
int
>();
Pair office =
new
Pair(0, 0);
Pair home =
new
Pair(5, 5);
Pair customer =
new
Pair(1, 1);
coordinates.Add(office);
coordinates.Add(home);
coordinates.Add(customer);
int
[, ] matrix
=
new
int
[noOfCustomers + 2, noOfCustomers + 2];
for
(
int
i = 0; i < noOfCustomers + 2; i++) {
for
(
int
j = 0; j < noOfCustomers + 2; j++) {
matrix[i, j] = CalculateDistance(
coordinates[i], coordinates[j]);
}
if
(i != 0 && i != 1) {
nodes.Add(i);
}
}
Console.WriteLine(FindMinDistanceUtil(
nodes, noOfCustomers, matrix));
}
static
public
void
Main()
{
FindMinDistance();
}
}