zoj 1004 , hrbust 1317 Anagrams by Stack【 dfs 】

题目连接 http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1317

题目大意

  如何根据一系列堆栈操作实现回文构词法呢?有两种堆栈的操作,将单词TROT转换成TORT。

  i代表入栈,o代表出栈。对给定的单词对,编程实现堆栈操作,将第一个单词转换为第二个单词。

  有多行输入。每两行的第一个是源单词(不包括换行符),第二行是目标单词(也不包括换行符)。由文件结束符标志输入结束。

  对每对单词,有多种有效的方法从源单词产生目标单词,将每种方法的i和o操作排序输出,并以[]分隔。排序的方法是字典序。每个i和o之后都有一个空格。

#include<stdio.h>
#include<string.h>

#define M 101
char s[M], t[M];
char a[2*M]; //存放i,o。
int len;
char stack[M]; //

 //count_i用来记录i的个数.
 //count_o用来记录o的个数.
void dfs(int tmp, int count_i, int count_o)
{
	if(tmp == 2*len) {
		int k = 0;
		for(int i = 0, j = 0, top = 0; i < tmp; i++) {
			if(a[i] == 'i') {
				stack[top++] = s[j++];
			} else if(a[i] == 'o' && stack[top-1] == t[k]) {
				top--;
				k++;
			} else {
				return;
			}
		}
		if(k == len) {
			for(int i = 0; i < tmp; i++) {
				printf("%c ", a[i]);
			}
			printf("\n");
		}
		return;
	}
	//如果i的个数等于字符串的长度,那么接下来只能输入o。
	if( count_i == len ) { 
		a[tmp] = 'o';
		dfs(tmp+1, count_i, count_o+1);
		//如果i的个数等于0或者i的个数减o等于0,那么接下来只能输入i。
	} else if(count_i == 0 || count_i - count_o == 0) { 
		a[tmp] = 'i';
		dfs(tmp+1, count_i+1, count_o);
	} else {
		a[tmp] = 'i';
		dfs(tmp+1, count_i+1, count_o);
		a[tmp] = 'o';
		dfs(tmp+1, count_i, count_o+1);
	}
}

int main()
{
	while(scanf("%s %s", s, t) != EOF) {
		printf("[\n");
		len = strlen(s);
		if(len != strlen(t)) {
			printf("]\n");
			continue;
		}
		a[0] = 'i';
		dfs(1, 1, 0);

		printf("]\n");
	}
	return 0;
}

  这个代码效率有点低。。。

在哈理工的oj上跑了500多ms,别人都是0ms过的。。。

惭愧--!

posted @ 2012-11-03 22:58  小猴子、  阅读(458)  评论(0编辑  收藏  举报