码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2488 A Knight's Journey 递归回溯题解

时间:2014-08-03 18:05:45      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:style   os   io   for   ar   代码   line   new   

简单的递归回溯法,锻炼基本的编程能力。

这类题是对代码能力的要求比对思想的要求高点。

而且要审题,题目要求安lexicographically 顺序输出,不小心递归的顺序就会输出错误了。

棋盘是由数字列或者行,和字母列或者行组成的,故此输出结果要注意。

个人觉得我的递归回溯写法是非常清晰, 工整的,O(∩_∩)O哈哈~


#include <stdio.h>
#include <string.h>
const int MAX_N = 27;
bool board[MAX_N][MAX_N];
int res[MAX_N*MAX_N];
int row, col, total, id;

inline bool isLegal(int r, int c)
{
	return 0<=r && 0<=c && r<row && c<col && !board[r][c];
}

bool getTourPath(int r = 0, int c = 0, int n = 0)//r为字母, c为数字
{
	if (n == total) return true;
	if (!isLegal(r, c)) return false;
	res[id] = r, res[id+1] = c;//record result
	board[r][c] = true;//mark
	++++id, ++n;
	if (getTourPath(r-2, c-1, n)) return true;
	if (getTourPath(r-2, c+1, n)) return true;
	if (getTourPath(r-1, c-2, n)) return true;
	if (getTourPath(r-1, c+2, n)) return true;
	if (getTourPath(r+1, c-2, n)) return true;
	if (getTourPath(r+1, c+2, n)) return true;
	if (getTourPath(r+2, c-1, n)) return true;
	if (getTourPath(r+2, c+1, n)) return true;
	----id, --n;
	board[r][c] = false;//unmark
	return false;
}

int main()
{
	int T;
	scanf("%d", &T);
	for (int t = 1; t <= T; t++)
	{
		printf("Scenario #%d:\n", t);
		scanf("%d %d", &col, &row);
		memset(board, 0, sizeof(board));
		total = col*row;
		id = 0;
		if (getTourPath())
		{
			for (int i = 0; i < id; i += 2)
			{
				putchar(char(res[i]+'A'));
				putchar(char(res[i+1]+'1'));
			}
			putchar('\n');
		}
		else puts("impossible");
		putchar('\n');
	}
	return 0;
}



POJ 2488 A Knight's Journey 递归回溯题解,布布扣,bubuko.com

POJ 2488 A Knight's Journey 递归回溯题解

标签:style   os   io   for   ar   代码   line   new   

原文地址:http://blog.csdn.net/kenden23/article/details/38358815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!