POJ 2488 A Knight's Journey

17 篇文章 0 订阅

A Knight's Journey

DFS题目,采用回溯的方式接着道题目,这个题目,是求序列中最小的,那么我们只需保证在搜索的时候每次都搜索为搜索的序列中最小的即可。只需要在搜索方向的时候注意一下即可。优先搜索靠近左侧的,同样的情况下优先搜索靠近底边的。代码如下:

#include<stdio.h>
#include<string.h>


int map[30][30] ;
int dir[][2] ={{-2 , -1} , {-2 ,1} , {-1 , -2} , {-1 , 2} , 
	{1 , -2} , {1, 2} , {2 , -1} ,{2, 1}} ;

int n;
int row ;
int col ;
int pos ;
char str[100] ;

int dfs(int x , int y, int cnt){
	
	int i ;
	
	int xn ;
	int yn ;
	
	if(cnt == row * col)
		return 1 ;
	
	for(i = 0 ; i < 8 ; i ++){
		xn = x + dir[i][0] ;
		yn = y + dir[i][1] ;
		
		if(xn > 0 && xn <= row && yn > 0 && yn <= col){
			if(!map[xn][yn]){
				
				str[pos] = xn - 1 + 'A' ;
				pos ++ ;
				str[pos] = yn + '0' ;
				pos ++ ;
				map[xn][yn] = 1 ;
				if(dfs(xn , yn , cnt + 1)){
					return 1 ;
				}
				
				str[--pos] = '\0' ;
				str[--pos] = '\0' ;
				map[xn][yn] = 0 ;
				
			}
		}
	}
	
	return 0 ;
}

int main(){
	scanf("%d" , &n) ;
	int test ;
	test = 1 ;
	
	while(n--){
		scanf("%d %d" , &col , &row) ;
		printf("Scenario #%d:\n" , test++) ;
		
		int i ;
		int j ;
		
		memset(str , 0 , sizeof(str)) ;
		memset(map , 0 , sizeof(map)) ;
		pos = 0 ;
		bool flag = 0 ;
		
		for(i = 1 ; i <= row ; i ++){
			for(j = 1 ; j <= col ; j ++){
				map[i][j] = 1 ;
				str[pos] = i - 1 + 'A'  ;
				pos ++ ;
				str[pos] = j + '0' ;
				pos ++ ;
				if(dfs(i , j , 1)==1){
					flag = 1 ;	
					break ;
				}
				--pos ;
				str[pos] = '\0' ;
				--pos ;
				str[pos] = '\0' ;
				map[i][j] = 0 ;
			}
		}
		if(flag == 1){
			printf("%s\n" , str) ;
		}	
		else 
			printf("impossible\n") ;
		printf("\n") ;	
	}
	return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值