搜索编外的一道题即poj 3087

   题意:已知两堆木片s1和s2的初始状态,其木片数均为c,按给定规则能将他们相互交叉组合成一堆木片s12,再将s12的最底下的c块木片归为s1,最顶的c块木片归为s2,依此循环下去。问经过多少次新的组合之后,s12的状态和目标状态des相同,若永远不可能相同,则输出"-1"。

   思路:这道题本来就是一道简单的基础的模拟题,真不知道那个孙子在网上第一次就说这是道搜索题,害人不浅,有时候发现网上很多资料都需要自己深层次的进行判断,不能全信!!这道题导致我在BFS上想了N久,最后模拟题水过。

模拟代码如下:

#include<iostream>
using namespace std;
int main()
{
    int n, c;
    char s1[105], s2[105], s12[210], des[210];
    cin >> n;
    for(int t = 1; t <= n; t ++)
	{
        cin >> c >> s1 >> s2 >> des;
        int ans = 0;
        bool flag = false;
        char str1[105];
        strcpy(str1, s1);  // str1保存原始状态的s1。
        while(!flag)
		{
            int i, k = 0;
            for(i = 0; i < c; i ++)
			{   // s1和s2按规则合成s12。
                s12[k ++] = s2[i];
                s12[k ++] = s1[i];
            }
            s12[k] = 0; 
            ans ++;
            if(!strcmp(s12, des))
			{   // 若s12与目标相同。
                flag = true;
                break;
            }
            for(i = 0, k = 0; k < c; k ++)  // 新的s1。
                s1[i ++] = s12[k];
            s1[i] = 0;
            for(i = 0, k = c; k < 2 * c; k ++)  // 新的s2。
                s2[i ++] = s12[k];
            s2[i] = 0;
            if(!strcmp(s1, str1))  // 等到s1经过x次变换后回到str1,则说明不可能到达目标情况了。
                break; 
        }
        if(flag) cout << t << ' ' << ans << endl;
        else cout << t << " -1" << endl;
    }
    return 0;
 }

 这道题算是搜索编外的一个小插曲吧,关于搜索的问题还需要去讨论,接下来依然会进行自己的搜索问题的研究!!

 

你可能感兴趣的:(poj)