问题链接:HDU1181 变形课。
问题简述:参见上述链接。
问题分析:这个问题就是一个单词接龙游戏,看能不能从b接到m。可以使用DFS来实现。计算过程中是没有必要存储整个单词,只需要存储单词的首尾字符就可以了。
程序说明:DFS处理过程中,使用visit[]数组记忆已经访问过的单词。如果找到解则置标志yesflag为1,作为搜索的结束条件。
读入数据时,没有使用scanf()函数,而是使用getchar()函数。这样做需要更高的技巧,需要了解更底层的字符流。一次读入一个字符串的话,需要一个字符数组作为缓冲存储,处理时间也会略长。
AC通过的C语言程序如下:
/* HDU1181 变形课 */ #include <stdio.h> #include <memory.h> #define START 'b' #define END 'm' #define MAXN 1024 char start[MAXN]; char end[MAXN]; int visit[MAXN]; int n; int yesflag; void dfs(char v) { int i; if(v == END) { yesflag = 1; return; } for(i=0; i<n; i++) { if(yesflag) break; if(!visit[i] && start[i] == v) { visit[i] = 1; dfs(end[i]); visit[i] = 0; } } } int main(void) { char c; while((c=getchar()) != EOF) { // 重复读入n个单词 n = 0; for(;;) { // 首字符 start[n] = end[n] = c; // 判定字符串结束 if(start[n] == '0') { getchar(); // 去除换行符 break; } // 读入一行; while((c=getchar()) != ' ') end[n] = c; n++; c = getchar(); // 下一行的首字符 } yesflag = 0; memset(visit, 0, sizeof(visit)); if(n > 0) dfs(START); // 输出结果 if(yesflag) printf("Yes. "); else printf("No. "); } return 0; }