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;}