UVA 291 The House Of Santa Claus 解题报告

题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=4&page=show_problem&problem=227

  题意很简单,就是要我们以左下角的点“1”为起点,不能重复且不能间断,一笔画出整个图形,并按照节点序号递增的顺序,访问相邻的节点。不难想到这是一道DFS的题目,遍历所有的边且每条边只能访问一次。

      这里我是使用了一个对称的相邻矩阵map[][]来存储这个图。由于该图为一个连通图,因此从任意节点出发进行一次DFS,即可遍历所有节点和所有的边。

 1 #include <iostream>
 2 #include <string.h>
 3 #include <string>
 4 using namespace std;
 5 
 6 int map[6][6];    //无向图的相邻矩阵
 7 
 8 void dfs(int x, int k, string s)
 9 {
10     int y;
11     s += char(x + '0');  //符合条件的节点加入序列,这里要将x强制转换成字符型
12 if (k == 8)   //图上8条边都已经访问过,则输出 13 { 14 cout << s << endl; 15 return; 16 } 17 for (y = 1; y <= 5; y++) //按照节点序号递增的顺序访问邻接x的未访问边 18 { 19 if (map[x][y]) 20 { 21 map[x][y] = map[y][x] = 0;//标记该边已经访问过 22 dfs(y, k+1, s);   //从y出发,递归计算一笔画序列s的第k+1条边 23 map[x][y] = map[y][x] = 1; //恢复递归前该边的未访问标志 24 } 25 } 26 } 27 28 int main() 29 { 30 int i, j; 31 memset(map, 0, sizeof(map)); 32 for (i = 1; i <= 5; i++) 33 { 34 for (j = 1; j <= 5; j++) 35 { 36 if (i != j) 37 map[i][j] = map[j][i] = 1; //map的对角线为0,表示没有自环。 38 } 39 } 40 map[1][4] = map[4][1] = map[2][4] = map[4][2] = 0; //点1和4、点2和4没有边相连 41 dfs(1, 0, ""); //从节点1出发计算所有可能的访问序列 42 return 0; 43 }

 

posted @ 2013-05-01 20:07  windysai  阅读(506)  评论(0编辑  收藏  举报