#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct jtype {
int sum, _max;
} jtype_t;
typedef struct qtype {
int x, y;
} qtype_t;
const int T = 8;
const int QUE_MAX = T * T;
const int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1};
const int dy[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int best[T * T][T][T];
jtype_t good[T][T];
qtype_t que[T * T], rec[T * T];
int n, x, y;
void init()
{
int i;
memset(best, -1, sizeof (best));
puts("Please input the number of knight n = ");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
printf("No.%d knight's position x =\n", i);
scanf("%d", &rec[i].x);
printf("No.%d knight's position y =\n", i);
scanf("%d", &rec[i].y);
best[i][rec[i].x][rec[i].y] = 0;
} //for i
}
inline bool okJmp(int i, int x, int y)
{
return x >= 1 && x <= 4 && y >= 1 && y <= 4 && best[i][x][y] == -1;
}
void display()
{
int x, y, i;
for (x = 0; x < 5; x++)
{
putchar('\n');
for (y = 0; y < 5; y++)
{
for (i = 0; i < n; i++)
printf("%d ", best[i][x][y]);
putchar('\n');
} //for y
} //for x
putchar('\n');
}
void bfs()
{
int i, head, tail, step, m, sq, am, k, x1, y1;
for (i = 0; i < n; i++)
{
head = 1;
tail = 1;
que[head].x = rec[i].x;
que[head].y = rec[i].y;
step = 0;
m = head;
while (m <= tail)
{
sq = tail;
for (am = m; am < sq; am++)
{
for (k = 0; k < 8; k++)
{
x1 = que[am].x + dx[k];
y1 = que[am].y + dy[k];
if (okJmp(i, x1, y1))
{
tail = (tail + 1) % QUE_MAX;
que[tail].x = x1;
que[tail].y = y1;
best[i][x1][y1] = step + 1;
} //if
} //for k
} //for am
m = (sq + 1) % QUE_MAX;
step++;
} //while
} //for i
}
void outputGood()
{
int i, j;
printf("============================================\n");
for (i = 0; i < T; i++)
{
for (j = 0; j < T; j++)
printf("%d ", good[i][j]._max);
putchar('\n');
}
printf("============================================\n");
}
void _search()
{
int minX, minY, x, y, j, _min, sum;
bfs();
for (x = 0; x < T; x++)
{
for (y = 0; y < T; y++)
{
good[x][y].sum = 0;
good[x][y]._max = -1;
putchar('\n');
for (j = 0; j < n; j++)
{
good[x][y].sum += best[j][x][y];
if (best[j][x][y] > good[x][y]._max)
good[x][y]._max = best[j][x][y];
} //for j
} //for y
} //for x
printf("y: 0 1 2 3 4 5 6 7\n");
printf("x:");
for (x = 0; x < T; x++)
printf("[%d, %d]", good[x][y]._max, good[x][y].sum);
printf("\n\n");
_min = 0x7FFF;
outputGood();
for (x = 0; x < T; x++)
{
for (y = 0; y < T; y++)
{
if (good[x][y]._max < _min)
{
_min = good[x][y]._max;
sum = good[x][y].sum;
minX = x;
minY = y;
} //if
else if (good[x][y]._max == _min)
{
if (good[x][y].sum < sum)
{
sum = good[x][y].sum;
minX = x;
minY = y;
} //if
} //if
} //for y
} //for x
outputGood();
printf("best get-together's position: x = %d, y = %d\n", minX, minY);
printf("arrive at get-together's position's least days: %d\n", _min);
printf("all knights' steps' sum: %d\n", sum);
} //_search
int main()
{
init();
_search();
display();
return 0;
}
骑士聚会问题
最新推荐文章于 2020-10-13 19:12:48 发布