sicily 1152. 简单的马周游问题

summary

:

我本来是想找用来练习栈的题的,看到了这个题,一想,这个和八皇后问题有点类似, 可以用回溯解决,便开始了,纠结了2天,发现输不出答案来的,找了1天,终于找出了bug, 当看到黑色的屏幕上出现一行白色的一行数字时,我内牛满面............但是,ctrl+c,ctrl+v, 返回一了一个红红的WA,我检查了一下,发现第一人测试数据完了之后,栈没有清空, 还好C++允许在中间声明变量,我把stack对象放到中间,就解决问题了,然后还发现, 第一个测试数据完了之后,全都标志成了1了,我又把数组全部标志成了0,这时, 发现输入2时,没有输出的,我以为进入了循环,又在调试,调试了1天, 最后发现好像没什么问题,我就运行试试,可能是还没算出来,我就输入2, 在那里干等了10秒,发现出来了!心想,这个程序肯定超时了,交上去试试, 没想到返回了一个绿绿的AC,0.52sec,很明显,oj的测试用例不是2, 我纠结了3天的的1152,用栈来实现回溯的非递归做法,后来在网上查了一下, 有一个人用了回溯的递归实现,dsf(),百度了一下,原来是深度优先搜索,牛人! 下面是我的代码,很长,效率很低,不过是我自己为了练习栈独立完成的。 要刷就刷这种题,水题一点也不好玩!

代码:

#include <iostream>
#include <stack>

using namespace std;

struct node{
    int v;
    int f;
}m[5][6];

typedef struct{
    int x,y,d,v;
}T;

int main()
{
    T e;
    int a[30];
    int n,i,j,k,g,h,b;
    int d[8][2] = { -2,-1, -1,-2, 1,-2, 2,-1, 
                    2,1, 1,2, -1,2, -2,1 };

    for(i = 0; i < 5; i++){
        for(j = 0; j < 6; j++){
            m[i][j].v = 6 * i + j + 1;
            m[i][j].f = 0;
        }
    }
    while(cin >> n && n != -1){
        stack<T> s;
        for(i = 0; i < 5; i++){
            for(j = 0; j < 6; j++){
                m[i][j].f = 0;
            }
        }
        e.x = i = n / 6;
        e.y = j = n % 6 - 1;
        e.v = m[i][j].v;
        m[i][j].f = 1;
        e.d = -1;
        k = e.d + 1;
        s.push(e);
        while(!s.empty()){
            i = s.top().x;
            j = s.top().y;
            k = s.top().d + 1;
            m[i][j].f = 0;
            s.pop();
            while(k < 8){
                g = i + d[k][0];
                h = j + d[k][1];
                if(g >= 0 && g <= 4 && h >= 0 && h <= 5 && !m[g][h].f){
                    e.x = i; 
                    e.y = j; 
                    e.d = k;
                    e.v = m[i][j].v;
                    m[i][j].f = 1;
                    s.push(e);
                    i = g;
                    j = h;
                    k = -1;
                }
                else if(s.size() == 29){
                    e.x = i;
                    e.y = j;
                    e.v = m[i][j].v;
                    s.push(e);
                    for(b = 0; !s.empty(); b++){
                        a[b] = s.top().v;
                        s.pop();
                    }
                    for(b--; b >= 1; b--){
                        cout << a[b] << " ";
                    }
                    cout << a[0] << endl;
                    k = 8;
                }
                k++;
            }
            if(k == 9)
                break;
        }
    }
    return 0;
}