ZOJ 2416 Open the Lock
这几天很背,老是做不出题目来
总算搞定一个,可惜速度很满,慢就慢吧,反正能过(还是BFS)
#include <iostream>
#include <queue>
using namespace std;
bool RER[10000];
struct NODE
{
int x;
int step;
};
int main()
{
int t,i,a,b,n;
int n1,n2,n3,n4;
queue<NODE> CN;
NODE Start,Temp,TT;
cin >> n;
while(n--)
{
cin >> a >> b;
Start.x = a;
Start.step = 0;
CN.push(Start);
for(i =0;i<10000;++i)
RER[i]=false;
RER[a] = true;
while(!CN.empty())
{
Temp = CN.front();
CN.pop();
if(Temp.x == b)
break;
Temp.step++;
for(i=1;i<=1000;i*=10)
{
TT = Temp;
t = TT.x%(i*10);
if(t<i)
t = 0;
else
{
while(t>9)
t /= 10;
}
if(t!=9)
TT.x += i;
else
TT.x = TT.x - i*8;
if(RER[TT.x]==false)
{
CN.push(TT);
RER[TT.x]=true;
}
TT = Temp;
if(t!=1)
TT.x -= i;
else
TT.x = TT.x + i*8;
if(RER[TT.x]==false)
{
CN.push(TT);
RER[TT.x]=true;
}
}
TT = Temp;
n4 = Temp.x % 10;
n3 = Temp.x % 100 / 10;
n2 = Temp.x % 1000 / 100;
n1 = Temp.x / 1000;
if(RER[n2*1000+n1*100+n3*10+n4]==false)
{
TT.x = n2*1000+n1*100+n3*10+n4;
CN.push(TT);
RER[n2*1000+n1*100+n3*10+n4] = true;
}
if(RER[n1*1000+n3*100+n2*10+n4]==false)
{
TT.x = n1*1000+n3*100+n2*10+n4;
CN.push(TT);
RER[n1*1000+n3*100+n2*10+n4] = true;
}
if(RER[n1*1000+n2*100+n4*10+n3]==false)
{
TT.x = n1*1000+n2*100+n4*10+n3;
CN.push(TT);
RER[n1*1000+n2*100+n4*10+n3] = true;
}
}
cout << Temp.step << endl;
while(!CN.empty())
CN.pop();
}
return 0;
}
总算搞定一个,可惜速度很满,慢就慢吧,反正能过(还是BFS)
#include <iostream>
#include <queue>
using namespace std;
bool RER[10000];
struct NODE
{
int x;
int step;
};
int main()
{
int t,i,a,b,n;
int n1,n2,n3,n4;
queue<NODE> CN;
NODE Start,Temp,TT;
cin >> n;
while(n--)
{
cin >> a >> b;
Start.x = a;
Start.step = 0;
CN.push(Start);
for(i =0;i<10000;++i)
RER[i]=false;
RER[a] = true;
while(!CN.empty())
{
Temp = CN.front();
CN.pop();
if(Temp.x == b)
break;
Temp.step++;
for(i=1;i<=1000;i*=10)
{
TT = Temp;
t = TT.x%(i*10);
if(t<i)
t = 0;
else
{
while(t>9)
t /= 10;
}
if(t!=9)
TT.x += i;
else
TT.x = TT.x - i*8;
if(RER[TT.x]==false)
{
CN.push(TT);
RER[TT.x]=true;
}
TT = Temp;
if(t!=1)
TT.x -= i;
else
TT.x = TT.x + i*8;
if(RER[TT.x]==false)
{
CN.push(TT);
RER[TT.x]=true;
}
}
TT = Temp;
n4 = Temp.x % 10;
n3 = Temp.x % 100 / 10;
n2 = Temp.x % 1000 / 100;
n1 = Temp.x / 1000;
if(RER[n2*1000+n1*100+n3*10+n4]==false)
{
TT.x = n2*1000+n1*100+n3*10+n4;
CN.push(TT);
RER[n2*1000+n1*100+n3*10+n4] = true;
}
if(RER[n1*1000+n3*100+n2*10+n4]==false)
{
TT.x = n1*1000+n3*100+n2*10+n4;
CN.push(TT);
RER[n1*1000+n3*100+n2*10+n4] = true;
}
if(RER[n1*1000+n2*100+n4*10+n3]==false)
{
TT.x = n1*1000+n2*100+n4*10+n3;
CN.push(TT);
RER[n1*1000+n2*100+n4*10+n3] = true;
}
}
cout << Temp.step << endl;
while(!CN.empty())
CN.pop();
}
return 0;
}
浙公网安备 33010602011771号