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 ;
}