代码拉取完成,页面将自动刷新
同步操作将从 charlieshu/Algorithms 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include <iostream>
#include <string>
#include <math.h>
#include <queue>
using namespace std;
struct SecOrderRubikCube{
char f1,f2,f3,f4;
char l1,l2,l3,l4;
char b1,b2,b3,b4;
char r1,r2,r3,r4;
char u1,u2,u3,u4;
char d1,d2,d3,d4;
void fw(){
char f;
f = f1;
f1 = f3;
f3 = f4;
f4 = f2;
f2 = f;
f = u3;
u3 = l4;
l4 = d2;
d2 = r1;
r1 = f;
f = u4;
u4 = l2;
l2 = d1;
d1 = r3;
r3 = f;
return;
}
void fa(){
char f;
f = f1;
f1 = f2;
f2 = f4;
f4 = f3;
f3 = f;
f = u3;
u3 = r1;
r1 = d2;
d2 = l4;
l4 = f;
f = u4;
u4 = r3;
r3 = d1;
d1 = l2;
l2 = f;
return;
}
void bw(){
char f;
f = b1;
b1 = b3;
b3 = b4;
b4 = b2;
b2 = f;
f = u2;
u2 = r4;
r4 = d3;
d3 = l1;
l1 = f;
f = u1;
u1 = r2;
r2 = d4;
d4 = l3;
l3 = f;
return;
}
void ba(){
char f;
f = b1;
b1 = b2;
b2 = b4;
b4 = b3;
b3 = f;
f = u2;
u2 = l1;
l1 = d3;
d3 = r4;
r4 = f;
f = u1;
u1 = l3;
l3 = d4;
d4 = r2;
r2 = f;
return;
}
void lw(){
char f;
f = l1;
l1 = l3;
l3 = l4;
l4 = l2;
l2 = f;
f = u1;
u1 = b4;
b4 = d1;
d1 = f1;
f1 = f;
f = u3;
u3 = b2;
b2 = d3;
d3 = f3;
f3 = f;
return;
}
void la(){
char f;
f = l1;
l1 = l2;
l2 = l4;
l4 = l3;
l3 = f;
f = u1;
u1 = f1;
f1 = d1;
d1 = b4;
b4 = f;
f = u3;
u3 =f3;
f3 = d3;
d3 = b2;
b2 = f;
return;
}
void rw(){
char f;
f = r1;
r1 = r3;
r3 = r4;
r4 = r2;
r2 = f;
f = u4;
u4 = f4;
f4 = d4;
d4 = b1;
b1 = f;
f = u2;
u2 = f2;
f2 = d2;
d2 = b3;
b3 = f;
return;
}
void ra(){
char f;
f = r1;
r1 = r2;
r2 = r4;
r4 = r3;
r3 = f;
f = u4;
u4 = b1;
b1 = d4;
d4 = f4;
f4 = f;
f = u2;
u2 = b3;
b3 = d2;
d2 = f2;
f2 = f;
return;
}
void uw(){
char f;
f = u1;
u1 = u3;
u3 = u4;
u4 = u2;
u2 = f;
f = b2;
b2 = l2;
l2 = f2;
f2 = r2;
r2 = f;
f = b1;
b1 = l1;
l1 = f1;
f1 = r1;
r1 = f;
return;
}
void ua(){
char f;
f = u1;
u1 = u2;
u2 = u4;
u4 = u3;
u3 = f;
f = b2;
b2 = r2;
r2 = f2;
f2 = l2;
l2 = f;
f = b1;
b1 = r1;
r1 = f1;
f1 = r1;
r1 = f;
return;
}
void dw(){
char f ;
f = d1;
d1 = d3;
d3 = d4;
d4 = d2;
d2 = f;
f = f3;
f3 = l3;
l3 = b3;
b3 = r3;
r3 = f;
f = f4;
f4 = l4;
l4 = b4;
b4 = r4;
r4 = f;
return;
}
void da(){
char f;
f = d1;
d1 = d2;
d2 = d4;
d4 = d3;
d3 = f;
f = f3;
f3 = r3;
r3 = b3;
b3 = l3;
l3 = f;
f = f4;
f4 = r4;
r4 = b4;
b4 = l4;
l4 = f;
return;
}
bool check(){
if(f1 != f2 || f1 != f3 || f1 != f4)
return false;
if(l1 != l2 || l1 != l3 || l1 != l4)
return false;
if(b1 != b2 || b1 != b3 || b1 != b4)
return false;
if(r1 != r2 || r1 != r3 || r1 != r4)
return false;
if(u1 != u2 || u1 != u3 || u1 != u4)
return false;
if(d1 != d2 || d1 != d3 || d1 != d4)
return false;
return true;
}
};
int wsum=0,csum=0;
struct answer{
string ans;
int step;
answer operator + (answer a){
if(step <= a.step){
answer output;
output.step = step;
output.ans = ans;
return output;
}
else{
return a;
}
}
};
/*
yyoo
rggg
obrr
ogbb
yyrb
wwww
rgrr
bbbb
gooo
orgg
yyyy
wwww
*/
//answer dfs(SecOrderRubikCube cube,int k){
// if(k >= 14){
// answer output;
// output.step = -1;
// output.ans = "";
// wsum++;
// cout<<"<find a time out answer> "<<" "<<k<<" "<<wsum<<" "<<csum<<endl;
// return output;
// }
// if(cube.check()){
// answer output;
// output.step = k;
// output.ans = "";
// csum++;
// cout<<"<find a correct answer> "<<k<<endl;
// return output;
// }
// answer ans;
// answer l;
// ans.step = 0x7fffffff;
// for(int i=0;i<6;i++){
// if(i == 0){
// cube.fw();
// l = dfs(cube,k+1);
// l.ans = "fw"+l.ans;
// cube.fa();
// }
// else if(i == 1){
// cube.fa();
// l = dfs(cube,k+1);
// l.ans = "fa"+l.ans;
// cube.fw();
// }
// else if(i == 2){
// cube.lw();
// l = dfs(cube,k+1);
// l.ans = "lw"+l.ans;
// cube.la();
// }
// else if(i == 3){
// cube.la();
// l = dfs(cube,k+1);
// l.ans = "la"+l.ans;
// cube.lw();
// }
// else if(i == 4){
// cube.uw();
// l = dfs(cube,k+1);
// l.ans = "uw"+l.ans;
// cube.ua();
// }
// else if(i == 5){
// cube.ua();
// l = dfs(cube,k+1);
// l.ans = "ua"+l.ans;
// cube.uw();
// }
// if(l.step != -1)
// ans = ans+l;
// }
// return ans;
//}
queue<SecOrderRubikCube> q1;
queue<answer> q2;
answer bfs(SecOrderRubikCube cube){
answer ans;
SecOrderRubikCube Ccube=cube;
ans.ans = "";
ans.step = 0;
q1.push(Ccube);
q2.push(ans);
while(!Ccube.check()){
wsum++;
// cout<<"<times> "<<wsum<<" "<<q2.front().step<<endl;
printf("<times> %d %d %d\n",q2.front().step,q1.size(),wsum);
for(int i=0;i<6;i++){
// cout<<q1.size()<<" ";
Ccube = q1.front();
ans = q2.front();
if(i == 0){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'f' && ans.ans[ans.ans.length()-2] == 'a')
continue;
Ccube.fw();
ans.ans += "fw\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
else if(i == 1){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'f' && ans.ans[ans.ans.length()-2] == 'w')
continue;
Ccube.fa();
ans.ans += "fa\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
else if(i == 2){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'l' && ans.ans[ans.ans.length()-2] == 'a')
continue;
Ccube.lw();
ans.ans += "lw\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
else if(i == 3){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'l' && ans.ans[ans.ans.length()-2] == 'w')
continue;
Ccube.la();
ans.ans += "la\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
else if(i == 4){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'u' && ans.ans[ans.ans.length()-2] == 'a')
continue;
Ccube.uw();
ans.ans += "uw\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
else if(i == 5){
if(ans.ans.length() >= 3 && ans.ans[ans.ans.length()-3] == 'u' && ans.ans[ans.ans.length()-2] == 'w')
continue;
Ccube.ua();
ans.ans += "ua\n";
ans.step++;
q1.push(Ccube);
q2.push(ans);
}
if(Ccube.check()){
break;
}
}
q1.pop();
q2.pop();
}
return ans;
}
int main(){
SecOrderRubikCube cube;
char a1,a2,a3,a4;
cin>>a1>>a2>>a3>>a4;
cube.f1 = a1;
cube.f2 = a2;
cube.f3 = a3;
cube.f4 = a4;
cin>>a1>>a2>>a3>>a4;
cube.l1 = a1;
cube.l2 = a2;
cube.l3 = a3;
cube.l4 = a4;
cin>>a1>>a2>>a3>>a4;
cube.b1 = a1;
cube.b2 = a2;
cube.b3 = a3;
cube.b4 = a4;
cin>>a1>>a2>>a3>>a4;
cube.r1 = a1;
cube.r2 = a2;
cube.r3 = a3;
cube.r4 = a4;
cin>>a1>>a2>>a3>>a4;
cube.u1 = a1;
cube.u2 = a2;
cube.u3 = a3;
cube.u4 = a4;
cin>>a1>>a2>>a3>>a4;
cube.d1 = a1;
cube.d2 = a2;
cube.d3 = a3;
cube.d4 = a4;
// while(true){
// char input;
// cin>>input;
// if(input == '1'){
// cin>>input;
// if(input == 'f')
// cube.fw();
// else if(input == 'l')
// cube.lw();
// else if(input == 'b')
// cube.bw();
// else if(input == 'r')
// cube.rw();
// else if(input == 'u')
// cube.uw();
// else if(input == 'd')
// cube.dw();
// }
// else if(input == '2'){
// cin>>input;
// if(input == 'f')
// cube.fa();
// else if(input == 'l')
// cube.la();
// else if(input == 'b')
// cube.ba();
// else if(input == 'r')
// cube.ra();
// else if(input == 'u')
// cube.ua();
// else if(input == 'd')
// cube.da();
// }
// else{
// cout<<cube.check()<<endl;
// }
//
// cout
// <<cube.f1<<" "<<cube.f2<<" "<<cube.f3<<" "<<cube.f4<<endl
// <<cube.l1<<" "<<cube.l2<<" "<<cube.l3<<" "<<cube.l4<<endl
// <<cube.b1<<" "<<cube.b2<<" "<<cube.b3<<" "<<cube.b4<<endl
// <<cube.r1<<" "<<cube.r2<<" "<<cube.r3<<" "<<cube.r4<<endl
// <<cube.u1<<" "<<cube.u2<<" "<<cube.u3<<" "<<cube.u4<<endl
// <<cube.d1<<" "<<cube.d2<<" "<<cube.d3<<" "<<cube.d4<<endl;
//
// cout<<endl;
// }
cout<<cube.f1<<cube.f2<<cube.f3<<cube.f4<<endl;
answer out;
out = bfs(cube);
cout<<out.step<<endl;
cout<<out.ans<<endl;
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。