您的位置:首页 > 其它

POJ 2488 A Knight's Journey

2012-06-11 14:51 162 查看
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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: