(step4.3.5)hdu 1501(Zipper——DFS)

题目大意:是给定3个字符串,问前两个是否能够组成第3个字符串。此题是个非常经典的dfs题.


解题思路:DFS


代码如下:有详细的注释

 

/*

 * 1501_2.cpp

 *

 *  Created on: 2013年8月17日

 *      Author: Administrator

 */



#include <iostream>

using namespace std;



char str1[201], str2[201], str3[401];

int len1, len2, len3;

bool flag;

bool hash[201][201];



/**

 * str1、str2、str3分别用来保存第1、2、3个字符串

 * len1、len2、len3分别是第1、2、3个字符串的长度

 * flag : 判断是否有解

 * hash[][] :判断是否已经访问过

 */

void dfs(int a, int b, int c) {

	if (flag) {

		return;

	}



	if (c == len3) {

		flag = true;

		return;

	}



	if (hash[a][b]) {

		return;

	}



	hash[a][b] = true;//这个千万不要漏了...表示这种组合已经试过

	if (str1[a] == str3[c]) {//如果str1第a个位置上的字符与str2第c个位置上的字符相等

		dfs(a + 1, b, c + 1);

	}



	if (str2[b] == str3[c]) {//如果str2第b个位置上的字符和str2第c个位置上的字符相等

		dfs(a, b + 1, c + 1);

	}

}



int main() {

	int t;



	scanf("%d", &t);

	int count = 1;

	int i;

	for( i = 1 ;i <= t ; ++i){

		flag = false;

		memset(hash, 0, sizeof(hash));

		scanf("%s%s%s", str1, str2, str3);



		len1 = strlen(str1);

		len2 = strlen(str2);

		len3 = strlen(str3);

		if (len1 + len2 != len3) {

			printf("Data set %d: no\n",count++);

			continue;

		}



		dfs(0, 0, 0);

		printf("Data set %d: %s\n", count++,flag?"yes":"no");



	}

}


 


 

你可能感兴趣的:(zip)