Sicily 1515. 魔版C[Speical judge]

来源:互联网 发布:如何在淘宝卖充值卡 编辑:程序博客网 时间:2024/05/22 05:33
/*只不过是对1151的初始状态和ABC变换进行修改罢了 *//*Run Time: 0.12secsRun Memory: 964KB*/#include <iostream>#include <string>#include <memory.h>     //memset初始化 #include <set>#include <queue>using namespace std;typedef struct Node{    int node[8];     string parents;};int N;          //要求步数 int dest[8];    //目标状态 int source[] = {1, 2, 3, 4, 5, 6, 7, 8};  //初始状态 int cantorNum[] = {5040, 720, 120, 24, 6, 2, 1, 1};   //长为n的序列的康拓展开需要用到的数:7!,6!...1!,0! int cantor(const Node& theNode){    int result = 0;     for(int i=0; i<8; i++){        int num = 0;        for(int j=i+1; j<8; j++){            if(theNode.node[j] < theNode.node[i]){                num++;            }        }        result += num * cantorNum[i];    }    return result;}bool isSame(int a[8], int b[8]){    for(int i=0; i<8; i++)        if(a[i] != b[i])            return false;    return true;} //A:左右两列互换Node A(const Node& inputNode){    Node newOne;    newOne.node[0] = inputNode.node[2];    newOne.node[1] = inputNode.node[3];    newOne.node[2] = inputNode.node[0];    newOne.node[3] = inputNode.node[1];    newOne.node[4] = inputNode.node[6];    newOne.node[5] = inputNode.node[7];    newOne.node[6] = inputNode.node[4];    newOne.node[7] = inputNode.node[5];        newOne.parents = inputNode.parents + "A";      return newOne;}//B:每次以行循环左移一个Node B(const Node& inputNode){    Node newOne;    newOne.node[0] = inputNode.node[1];    newOne.node[1] = inputNode.node[2];    newOne.node[2] = inputNode.node[3];    newOne.node[3] = inputNode.node[0];    newOne.node[4] = inputNode.node[5];    newOne.node[5] = inputNode.node[6];    newOne.node[6] = inputNode.node[7];    newOne.node[7] = inputNode.node[4];        newOne.parents = inputNode.parents + "B";      return newOne;}//C:中间四小块逆时针转一格Node C(const Node& inputNode){    Node newOne;    newOne.node[0] = inputNode.node[0];    newOne.node[1] = inputNode.node[2];    newOne.node[2] = inputNode.node[6];    newOne.node[3] = inputNode.node[3];    newOne.node[4] = inputNode.node[4];    newOne.node[5] = inputNode.node[1];    newOne.node[6] = inputNode.node[5];    newOne.node[7] = inputNode.node[7];        newOne.parents = inputNode.parents + "C";      return newOne;}Node find(Node sourceNode){    queue<Node> nodeQueue; //节点队列     int used[50000];       //使用过的状态     memset(used, 0, sizeof(used));        if(isSame(sourceNode.node, dest))        return sourceNode;     nodeQueue.push(sourceNode);    used[cantor(sourceNode)] = 1;    while(!nodeQueue.empty()){        Node theNode = nodeQueue.front();    //获取队列头                         nodeQueue.pop();                if(theNode.parents.length() >= N){    //超出步数时候退出循环            break;        }                Node bufNewNode[3];        bufNewNode[0] = A(theNode);         bufNewNode[1] = B(theNode);         bufNewNode[2] = C(theNode);                 for(int i=0; i<3; i++){            if(isSame(bufNewNode[i].node, dest))    //如果找到了目标,则返回结果                 return bufNewNode[i];                        if(used[cantor(bufNewNode[i])] == 0){  //不是目标则检查其是否已经看过,否则记录的同时放入队列                 nodeQueue.push(bufNewNode[i]);                used[cantor(bufNewNode[i])] = 1;            }        }    }     Node notFound;    notFound.parents = "NotFound";        return notFound;}int main(){      while (cin>>N && (N!=-1)){        for(int i=0; i<8; i++)            cin >> dest[i];        //设定初始状态,传入方法开始执行         Node bufNode;        for(int i=0; i<8; i++)                bufNode.node[i] = source[i];        bufNode.parents = "";                Node destNode = find(bufNode);                if(destNode.parents == "NotFound"){            cout << "-1" << endl;        }else{            cout << destNode.parents.length() << " " << destNode.parents << endl;        }    }         return 0;}

原创粉丝点击