NOIP 2002 字串变换 解题报告
挺好的题目,以后记住,当出现初始状态和目标状态求最短路径的时候就用双向DFS,速度快很多!!!
双向BFS的资料:http://www.cnblogs.com/yylogo/archive/2011/07/25/double-bfs.html
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct {
char str[401];
int sep;
}q1[20000], q2[20000];
int h1, r1, h2, r2;
char s1[6][21], s2[6][21];
int l1[6], l2[6];
int n;
void newcopy2(int start, int use)
{
int i, j;
r2++;
q2[r2].sep = q2[h2].sep + 1;
for(i = 0; i < start; i++){
q2[r2].str[i] = q2[h2].str[i];
}
for(j = 0; s1[use][j] != '\0'; j++, i++){
q2[r2].str[i] = s1[use][j];
}
for(j = start + strlen(s2[use]); q2[h2].str[j] != '\0'; j++, i++){
q2[r2].str[i] = q2[h2].str[j];
}
for(i = 0; i < r1; i++){
if(strcmp(q1[i].str, q2[r2].str) == 0){
printf("%d\n", q1[i].sep + q2[r2].sep);
exit(0);
}
}
}
void newcopy1(int start, int use)
{
int i, j;
r1++;
q1[r1].sep = q1[h1].sep + 1;
for(i = 0; i < start; i++){
q1[r1].str[i] = q1[h1].str[i];
}
for(j = 0; s2[use][j] != '\0'; j++, i++){
q1[r1].str[i] = s2[use][j];
}
for(j = start + strlen(s1[use]); q1[h1].str[j] != '\0'; j++, i++){
q1[r1].str[i] = q1[h1].str[j];
}
for(i = 0; i < r1; i++){
if(strcmp(q2[i].str, q1[r1].str) == 0){
printf("%d\n", q2[i].sep + q1[r1].sep);
exit(0);
}
}
}
void deal(void)
{
int i, j;
while(h1 <= r1 && h2 <= r2){
if(q1[h1].sep + q2[h2].sep > 10){
printf("NO ANSWER!\n");
exit(0);
}
for(i = 0; i < strlen(q1[h1].str); i++){
for(j = 0; j < n; j++){
if(strncmp(s1[j], &q1[h1].str[i], strlen(s1[j])) == 0){
newcopy1(i, j);
}
}
}
h1++;
for(i = 0; i < strlen(q2[h2].str); i++){
for(j = 0; j < n; j++){
if(strncmp(s2[j], &q2[h2].str[i], strlen(s2[j])) == 0){
newcopy2(i, j);
}
}
}
h2++;
}
}
int main(int argc, char **argv)
{
scanf("%s%s", q1[0].str, q2[0].str);
while(scanf("%s%s", s1[n], s2[n]) == 2){
n++;
}
deal();
printf("NO ANSWER!\n");
return 0;
}
浙公网安备 33010602011771号