Description
In your childhood you most likely had to solve the riddle of the house of Santa Claus. Do you remember that the importance was on drawing the house in a stretch without lifting the pencil and not drawing a line twice? As a reminder it has to look like shown in Figure 1.
Figure: The House of Santa Claus
Well, a couple of years later, like now, you have to ``draw'' the house again but on the computer. As one possibility is not enough, we require all the possibilities when starting in the lower left corner. Follow the example in Figure 2 while defining your stretch.
Figure: This Sequence would give the Outputline 153125432
All the possibilities have to be listed in the outputfile by increasing order, meaning that 1234... is listed before 1235... .
Output
So, an outputfile could look like this:
12435123 13245123 ... 15123421
#include <iostream>
#include <cstring>
using namespace std;
int map[6][6];
void makemap()
{
memset(map,0,sizeof(map));
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5;j++)
if(i!=j)
map[i][j]=1;
map[1][4]=map[4][1]=0;
map[2][4]=map[4][2]=0;
}
}
void dfs(int x,int k,string s)//DFS遍历,目前已生成长度为k-1的一笔画序列s,准备将x扩展为s的第k条边
{
s=s+char(x+'0');//节点x进入访问序列
if(k==8)//若完成了一笔画,则输出一笔画序列s
{
cout<<s<<endl;
return;
}
int i;
for(i=1;i<=5;i++)//按照节点序号递增的顺序访问邻接x未访问
{
if(map[x][i]!=0)
{
map[x][i]=map[i][x]=0;
dfs(i,k+1,s);
map[x][i]=map[i][x]=1;
}
}
}
int main()
{
makemap();//生成无向图的相邻矩阵
dfs(1,0,"");//从节点1出发计算所有可能的访问序列
}