| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
双广G++2S多过了,想用C++刷少点时间,结果TLE,无奈啊,附代码Source Code
Problem: 3131 User: yzhw
Memory: 35704K Time: 2250MS
Language: G++ Result: Accepted
Source Code
# include <iostream>
# include <set>
# include <queue>
# define _get(a,b) (((a)>>(3*(8-(b))))&7)
# define _change(a,b,c) ((a)=(((a)&mask[(b)])|((c)<<(3*(8-(b))))))
using namespace std;
unsigned int ori[9],mask[9],refer[9][80000],*ans;
unsigned int used[8000000];
int _next[8][2]={0,0,0,0,6,5,4,7,3,6,7,2,2,4,5,3};
queue<unsigned int> q1;
queue<char> q2;
int chk(unsigned int pos)
{
pos>>=5;
int p=pos%79999;
while(ans[p]!=0xffffffff&&(ans[p]>>5)!=(pos))
p=(p+1)%80000;
if ((ans[p]>>5)==(pos))
return ans[p]&31;
else
return -1;
}
bool gethash(unsigned int pos)
{
int p=pos%7999999;
while(used[p]!=0xffffffff&&(used[p])!=pos)
p=(p+1)%8000000;
return used[p]==pos;
}
void puthash(unsigned int pos)
{
int p=(pos)%7999999;
while(used[p]!=0xffffffff)
p=(p+1)%8000000;
used[p]=pos;
}
//int ccount=0;
void make_bfs(unsigned int s,int limit)
{
unsigned int tmp;
int p;
while(!q1.empty())
q1.pop();
q1.push(s);
p=(s>>5)%79999;
while(ans[p]!=0xffffffff)
p=(p+1)%80000;
ans[p]=s;
while(!q1.empty())
{
tmp=q1.front();
q1.pop();
if((tmp&31)>=limit) continue;
s=(tmp>>5);
int e=0;
for(int i=0;i<9;i++)
if(_get(s,i)==1)
{
e=i;
break;
}
if(e/3!=0)
{
_change(s,e,_next[_get(s,e-3)][0]);
_change(s,e-3,1);
if(chk(((s<<5)|((tmp&31)+1)))==-1)
{
p=s%79999;
while(ans[p]!=0xffffffff)
p=(p+1)%80000;
ans[p]=((s<<5)|((tmp&31)+1));
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e-3,_next[_get(s,e)][0]);
_change(s,e,1);
}
if(e/3!=2)
{
_change(s,e,_next[_get(s,e+3)][0]);
_change(s,e+3,1);
if(chk(((s<<5)|((tmp&31)+1)))==-1)
{
p=s%79999;
while(ans[p]!=0xffffffff)
p=(p+1)%80000;
ans[p]=((s<<5)|((tmp&31)+1));
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e+3,_next[_get(s,e)][0]);
_change(s,e,1);
}
if(e%3!=0)
{
_change(s,e,_next[_get(s,e-1)][1]);
_change(s,e-1,1);
if(chk(((s<<5)|((tmp&31)+1)))==-1)
{
p=s%79999;
while(ans[p]!=0xffffffff)
p=(p+1)%80000;
ans[p]=((s<<5)|((tmp&31)+1));
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e-1,_next[_get(s,e)][1]);
_change(s,e,1);
}
if(e%3!=2)
{
_change(s,e,_next[_get(s,e+1)][1]);
_change(s,e+1,1);
if(chk(((s<<5)|((tmp&31)+1)))==-1)
{
p=s%79999;
while(ans[p]!=0xffffffff)
p=(p+1)%80000;
ans[p]=((s<<5)|((tmp&31)+1));
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e+1,_next[_get(s,e)][1]);
_change(s,e,1);
}
}
}
int bfs()
{
unsigned int tmp;
if(chk(q1.front())!=-1)
return chk(q1.front());
while(!q1.empty())
{
tmp=q1.front();
q1.pop();
if((tmp&31)>=12) continue;
int s=(tmp>>5);
int e=0;
for(int i=0;i<9;i++)
if(_get(s,i)==1)
{
e=i;
break;
}
if((tmp&31)>=30) continue;
if(e/3!=0)
{
_change(s,e,_next[_get(s,e-3)][0]);
_change(s,e-3,1);
int len=chk(s<<5);
if(len!=-1)
return (tmp&31)+1+len;
if(!gethash(s))
{
puthash(s);
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e-3,_next[_get(s,e)][0]);
_change(s,e,1);
}
if(e/3!=2)
{
_change(s,e,_next[_get(s,e+3)][0]);
_change(s,e+3,1);
int len=chk(s<<5);
if(len!=-1)
return (tmp&31)+1+len;
if(!gethash(s))
{
puthash(s);
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e+3,_next[_get(s,e)][0]);
_change(s,e,1);
}
if(e%3!=0)
{
_change(s,e,_next[_get(s,e-1)][1]);
_change(s,e-1,1);
int len=chk(s<<5);
if(len!=-1)
return (tmp&31)+1+len;
if(!gethash(s))
{
puthash(s);
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e-1,_next[_get(s,e)][1]);
_change(s,e,1);
}
if(e%3!=2)
{
_change(s,e,_next[_get(s,e+1)][1]);
_change(s,e+1,1);
int len=chk(s<<5);
if(len!=-1)
return (tmp&31)+1+len;
if(!gethash(s))
{
puthash(s);
q1.push((s<<5)|((tmp&31)+1));
}
_change(s,e+1,_next[_get(s,e)][1]);
_change(s,e,1);
}
}
return -1;
}
void init()
{
for(int i=0;i<9;i++)
{
ori[i]=0;
for(int j=0;j<i;j++)
{
ori[i]<<=3;
ori[i]|=2;
}
ori[i]<<=3;
ori[i]|=1;
for(int j=i+1;j<9;j++)
{
ori[i]<<=3;
ori[i]|=2;
}
}
for(int i=0;i<9;i++)
{
mask[i]=0;
for(int j=0;j<i;j++)
{
mask[i]<<=3;
mask[i]|=7;
}
mask[i]<<=3;
for(int j=i+1;j<9;j++)
{
mask[i]<<=3;
mask[i]|=7;
}
}
for(int i=0;i<9;i++)
for(int j=0;j<80000;j++)
refer[i][j]=0xffffffff;
for(int i=0;i<9;i++)
{
ans=refer[i];
make_bfs(ori[i]<<5,18);
}
}
int minnum=0xfffffff;
void make_end(char *str,int l,unsigned int num)
{
if(l==9)
{
int len=chk(num<<5);
if(len!=-1&&len<=minnum)
{
minnum=len;
while(!q1.empty())
q1.pop();
}
q1.push(num<<5);
puthash(num);
}
else
{
num<<=3;
switch(*str)
{
case 'W':
make_end(str+1,l+1,num|2);
make_end(str+1,l+1,num|3);
break;
case 'B':
make_end(str+1,l+1,num|4);
make_end(str+1,l+1,num|5);
break;
case 'R':
make_end(str+1,l+1,num|6);
make_end(str+1,l+1,num|7);
break;
case 'E':
make_end(str+1,l+1,num|1);
break;
};
}
}
int main()
{
int r,c;
init();
while(cin>>c>>r)
{
if(!c&&!r) break;
c--;
r--;
minnum=0xfffffff;
char tar[10];
for(int i=0;i<9;i++)
{
cin>>tar[i];
}
ans=refer[r*3+c];
for(int i=0;i<8000000;i++)
used[i]=0xffffffff;
while(!q1.empty())
q1.pop();
make_end(tar,0,0);
cout<<bfs()<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator