策略:普通的DFS
#include <iostream>
#include <memory.h>
using namespace std;
bool visited[5][6];
int next_x[8] = {-2, -2,-1, -1, 1, 1, 2, 2};
int next_y[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
int road[31];
int flag = 0;
bool Check(int row,int col)//检查一个节点是否出界或者已经被访问过
{
if(visited[row][col] == false && row >= 0 && row < 5 && col >= 0 && col < 6)
return true;
else
return false;
}
void dfs(int row,int col,int step)
{
visited[row][col] = true;
road[step] = 6 * row + col + 1;
//if(flag == 1)
//return;
if(step == 30)
{
//flag = 1;
return;
}
for(int i = 0;i < 8;i++)
{
int next_row = row + next_x[i];
int next_col = col + next_y[i];
if(Check(next_row,next_col))
{
dfs(next_row,next_col,step + 1);
}
}
if(road[step + 1] == 0)//表示上面的循环没有找到一个符合条件的点
{
road[step] = 0;
visited[row][col] = false;
}
}
int main()
{
int n;
while(cin >> n && n != -1)
{
memset(visited,false,sizeof(visited));
memset(road,0,sizeof(road));
int current = 1;
int start_x = (n - 1) / 6;
int start_y = (n - 1) % 6;
flag = 0;
dfs(start_x,start_y,current);
for(int i = 1;i <= 30;i++)
{
cout << road[i];
if(i != 30)
cout << " ";
}
cout << endl;
}
return 0;
}