要求:一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市。输出所有符合要求的路线。
方法:dfs
#include<iostream>
#include<stdio.h>
#include<queue>
#include<map>
#include<string.h>
#include<math.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std ;
int cnt ;
int m ;
int ans[50] ;
int used[50] ;
int map1[50][50] ;
void output()
{
int i , j ;
printf("%d: %d " , ++cnt , m) ;
for(i = 0 ; i < 19 ; i ++)
printf("%d " , ans[i]) ;
printf("%d\n" , m) ;
}
void dfs(int n , int k)
{
int i , j ;
if(k == 19 && map1[n][m])
{
output() ;
return ;
}
for(i = 1 ; i <= 20 ; i ++)
if(map1[n][i] && !used[i])
{
used[i] = 1 ;
ans[k] = i ;
dfs(i , k + 1) ;
used[i] = 0 ;
}
}
int main()
{
int i , j , k ;
int a , b , c ;
memset(map1 , 0 , sizeof(map1)) ;
for(i = 1 ; i <= 20 ; i ++)
{
scanf("%d%d%d" , &a , &b , &c) ;
map1[i][a] = map1[a][i] = 1 ;
map1[i][b] = map1[b][i] = 1 ;
map1[i][c] = map1[c][i] = 1 ;
}
while(scanf("%d" , &m) && m != 0)
{
cnt = 0 ;
memset(used , 0 , sizeof(used)) ;
used[m] = 1 ;
dfs(m , 0) ;
}
}