大概思路跟1150的一样,数据量大了,我刚开始是用set<string>来存已经变换过的魔板,结果TLE,后来网上查了一下,用康托,结果WA。。但是我又不知道错在哪。最后用set<int>来存,AC了哦
/* * 1150.cpp * * Created on: Dec 18, 2010 * Author: alfred */ #include <queue> #include <string> #include <cstring> #include <iostream> #include <set> using namespace std; struct step { int status[8]; string step; }; int target[8]; const int init[8] = {1, 2, 3, 4, 8, 7, 6, 5}; int maxStep; set<long> s; //bool isUsed[50000]; //int fac[8]; // //void setFac() { // fac[0] = fac[1] = 1; // for(int i = 2; i < 8; i++) { // fac[i] = fac[i - 1] * i; // } //} //int getID(int* tar) { // bool used[8]; // memset(used, false, sizeof(used)); // int id = 0; // for(int i = 0; i < 8; i++) { // for(int j = 1; j < tar[i]; j++) { // if(!used[j]) id += fac[7 - i]; // } // used[tar[i] - 1] = true; // } // return id; //} long getID(int* tar) { return tar[7] * 1 + tar[6] * 10 + tar[5] * 100 + tar[4] * 1000 + tar[3] * 10000 + tar[2] * 100000 + tar[1] * 1000000 + tar[0] * 10000000; } void A(queue<step>& q, const step& statu) { step tmp; for(int i = 0; i < 4; i++) { tmp.status[i] = statu.status[i + 4]; tmp.status[i + 4] = statu.status[i]; } tmp.step = statu.step + 'A'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void B(queue<step>& q, const step& statu) { step tmp; for(int i = 1; i < 4; i++) { tmp.status[i] = statu.status[i - 1]; tmp.status[i + 4] = statu.status[i - 1 + 4]; } tmp.status[0] = statu.status[3]; tmp.status[4] = statu.status[7]; tmp.step = statu.step + 'B'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void C(queue<step>& q, const step& statu) { step tmp; tmp.status[0] = statu.status[0]; tmp.status[1] = statu.status[5]; tmp.status[2] = statu.status[1]; tmp.status[3] = statu.status[3]; tmp.status[4] = statu.status[4]; tmp.status[5] = statu.status[6]; tmp.status[6] = statu.status[2]; tmp.status[7] = statu.status[7]; tmp.step = statu.step + 'C'; long id = getID(tmp.status); if(s.find(id) == s.end()) { q.push(tmp); // isUsed[id] = true; s.insert(id); } } void bfs() { s.clear(); // memset(isUsed, false, sizeof(isUsed)); queue<step> q; step tmp; memcpy(tmp.status, init, sizeof(init)); q.push(tmp); long id = getID(tmp.status); // isUsed[id] = true; s.insert(id); while(!q.empty()) { tmp = q.front(); q.pop(); if(memcmp(tmp.status, target, sizeof(target)) == 0) { cout << tmp.step.size() << " " << tmp.step << endl; return; } if(tmp.step.size() == maxStep) { continue; } A(q, tmp); B(q, tmp); C(q, tmp); } cout << -1 << endl; } int main() { // setFac(); cin >> maxStep; while(maxStep != -1) { for(int i = 0; i < 8; i++) { cin >> target[i]; } bfs(); cin >> maxStep; } return 0; }
已换康托,0.22sec,不错。
#include <iostream> #include <string> #include <queue> #include <cstring> using namespace std; struct node { int s[8]; string step; }; int maxStep; int init[8] = {1, 2, 3, 4, 8, 7, 6, 5}; int tar[8]; int fac[7]; bool isUsed[50000]; void setFac() { fac[0] = 1; for(int i = 2; i <= 7; i++) { fac[i - 1] = fac[i - 2] * i; } } int getID(int *data) { bool used[8]; memset(used, false, sizeof(used)); int id = 0; for(int i = 0; i < 8; i++) { for(int j = 1; j < data[i]; j++) { if(!used[j - 1]) id += fac[6 - i]; } used[data[i] - 1] = true; } return id; } void bfs() { memset(isUsed, false, sizeof(isUsed)); queue<node> q; node _front; memcpy(_front.s, init, sizeof(init)); _front.step = ""; isUsed[getID(init)] = true; node _tmp; q.push(_front); int id; while(!q.empty()) { _front = q.front(); q.pop(); int step = _front.step.size(); if(memcmp(_front.s, tar, sizeof(tar)) == 0) { cout << step << " " << _front.step << endl; return ; } if(step >= maxStep) continue; _tmp = _front; //A operator _tmp.s[0] = _front.s[4]; _tmp.s[1] = _front.s[5]; _tmp.s[2] = _front.s[6]; _tmp.s[3] = _front.s[7]; _tmp.s[4] = _front.s[0]; _tmp.s[5] = _front.s[1]; _tmp.s[6] = _front.s[2]; _tmp.s[7] = _front.s[3]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "A"; q.push(_tmp); isUsed[id] = true; } //B operator _tmp.s[0] = _front.s[3]; _tmp.s[1] = _front.s[0]; _tmp.s[2] = _front.s[1]; _tmp.s[3] = _front.s[2]; _tmp.s[4] = _front.s[7]; _tmp.s[5] = _front.s[4]; _tmp.s[6] = _front.s[5]; _tmp.s[7] = _front.s[6]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "B"; q.push(_tmp); isUsed[id] = true; } //C operator _tmp.s[0] = _front.s[0]; _tmp.s[1] = _front.s[5]; _tmp.s[2] = _front.s[1]; _tmp.s[3] = _front.s[3]; _tmp.s[4] = _front.s[4]; _tmp.s[5] = _front.s[6]; _tmp.s[6] = _front.s[2]; _tmp.s[7] = _front.s[7]; id = getID(_tmp.s); if(!isUsed[id]) { _tmp.step = _front.step + "C"; q.push(_tmp); isUsed[id] = true; } } cout << -1 << endl; } int main() { int a; setFac(); while(cin >> maxStep && maxStep != -1) { for(int i = 0; i < 8; i++) { cin >> tar[i]; } bfs(); } return 0; }
396

被折叠的 条评论
为什么被折叠?



