数据结构与算法10:马踏棋盘问题(骑士周游问题)

    问题描述:在一个国际象棋的棋盘上,一个马按照它的规则如何才能从一个点出发遍历每一个位置,且每个点只访问一次。

    问题分析:这是一个深搜的问题,沿着一条路前进直到遍历全部的点,那就完成了整个的过程。如果不行,就回退一步,换个方向继续前进。这可以用递归很方便地实现。注意到马在某个位置最多有8个方向可以走,因此需要对这8个方向进行试探。当然这8个方向不一定都存在,比如在边缘可能就会少一些。考虑到实际8*8的棋盘计算量比较大,我们使用6*6代替。

#include <stdio.h>
#define N 6

int chess[N][N];

int next(int* x, int* y, int dir)
{
	switch(dir)
	{
	case 1:
		if (*x+1 < N && *y-2 >= 0 && chess[*x+1][*y-2] == 0)
		{
			*x += 1;
			*y -= 2;
			return 1;
		}
		break;
	case 2:
		if (*x+2 < N && *y-1 >= 0 && chess[*x+2][*y-1] == 0)
		{
			*x += 2;
			*y -= 1;
			return 1;
		}
		break;
	case 3:
		if (*x+2 < N && *y+1 < N && chess[*x+2][*y+1] == 0)
		{
			*x += 2;
			*y += 1;
			return 1;
		}
		break;
	case 4:
		if (*x+1 < N && *y+2 < N && chess[*x+1][*y+2] == 0)
		{
			*x += 1;
			*y += 2;
			return 1;
		}
		break;
	case 5:
		if (*x-1 >= 0 && *y+2 < N && chess[*x-1][*y+2] == 0)
		{
			*x -= 1;
			*y += 2;
			return 1;
		}
		break;
	case 6:
		if (*x-2 >= 0 && *y+1 < N && chess[*x-2][*y+1] == 0)
		{
			*x -= 2;
			*y += 1;
			return 1;
		}
		break;
	case 7:
		if (*x-2 >= 0 && *y-1 >= 0 && chess[*x-2][*y-1] == 0)
		{
			*x -= 2;
			*y -= 1;
			return 1;
		}
		break;
	case 8:
		if (*x-1 >= 0 && *y-2 >= 0 && chess[*x-1][*y-2] == 0)
		{
			*x -= 1;
			*y -= 2;
			return 1;
		}
		break;
	}
	return 0;
}

int search(int x, int y, int now)
{
	int x1=x, y1=y;
	chess[x][y] = now;
	if (now == N*N)
		return 1;
	if (next(&x1, &y1, 1))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 2))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 3))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 4))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 5))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 6)
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 7))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	if (next(&x1, &y1, 8))
	{
		if (search(x1, x2, now+1))
		{
			return 1;
		}
	}
	chess[x][y] = 0;
	return 0;
}

int main()
{
	search(0, 0, 1);
	return 0;
}


展开阅读全文

没有更多推荐了,返回首页