您的位置:首页 > 其它

704 - Colour Hash

2013-02-07 13:55 453 查看
/*双向bfs 偷懒 用map判重,没有用hash函数。

*/

#include<cstdio>

#include<cstring>

#include<map>

#include<string>

using namespace std;

map<string,int> vis;

map<string,int> visn;

char final[30]= {"034305650121078709T90121"},start[30];

struct S

{

char s[30];

int step;

int path;

int pr;

} a[110000],b[110000];

int change(int p,char *s)

{

char t[30];

strcpy(t,s);

if(p==1)

{

char x=s[10],y=s[11],z=s[9];

for(int i = 2; i < 12; i++)

{

s[i] = t[i-2];

}

s[0] = x;

s[1] = y;

s[21] = s[9];

s[22] = s[10];

s[23] = s[11];

}

else if(p==2)

{

char x = s[12],y=s[13];

for(int i = 12; i < 22; i++)

s[i] = t[i+2];

s[22] = x;

s[23] = y;

s[9] = s[21];

s[10] = s[22];

s[11] = s[23];

}

else if(p==3)

{

char x = s[0],y = s[1];

for(int i = 0; i < 10; i++)

s[i] = t[i+2];

s[10] = x;

s[11] = y;

s[21] = s[9];

s[22] = s[10];

s[23] = s[11];

}

else if(p==4)

{

char x = s[22],y = s[23];

for(int i = 14; i < 24; i++)

s[i] = t[i-2];

s[12] = x;

s[13] = y;

s[9] = s[21];

s[10] = s[22];

s[11] = s[23];

}

}

int print1(int u)

{

int v;

if(u)

{

v = b[u].pr;

if(v)

{

print1(v);

}

printf("%d",b[u].path);

}

}

int print2(int u)

{

if(u)

{

int v;

v = a[u].pr;

printf("%d",a[u].path);

if(v)

print2(v);

}

}

int bfs_n()

{

memset(a,0,sizeof(a));

int front = 0,rear = 1;

a[0].step = 0;

a[0].pr = -1;

visn.clear();

visn[final]=1;

strcpy(a[0].s,final);

while(front<rear)

{

if(a[front].step>8)

{

return 0;

}

for(int i = 1; i <= 4; i++)

{

char temp[30];

strcpy(temp,a[front].s);

change(i,temp);

if(!visn[temp])

{

visn[temp] = rear;

if(i==1)

a[rear].path=3;

else if(i==3)

a[rear].path=1;

else if(i==2)

a[rear].path=4;

else if(i==4)

a[rear].path=2;

a[rear].pr = front;

a[rear].step = a[front].step+1;

strcpy(a[rear].s,temp);

rear++;

}

}

front++;

}

return 0;

}

int bfs()

{

vis.clear();

memset(b,0,sizeof(b));

int front = 0,rear = 1;

b[0].step = 0;

b[0].pr = -1;

vis[start] = 1;

strcpy(b[0].s,start);

while(front<rear)

{

if(b[front].step>8)

{

printf("NO SOLUTION WAS FOUND IN 16 STEPS\n");

return 0;

}

if(!strcmp(final,b[front].s))

{

print1(front);

printf("\n");

return 0;

}

if(visn[b[front].s])

{

print1(front);

print2(visn[b[front].s]);

printf("\n");

return 0;

}

for(int i = 1; i <= 4; i++)

{

char temp[30];

strcpy(temp,b[front].s);

change(i,temp);

if(!vis[temp])

{

vis[temp] = 1;

b[rear].step = b[front].step+1;

b[rear].path = i;

b[rear].pr = front;

strcpy(b[rear].s,temp);

rear++;

}

}

front++;

}

return 0;

}

int main()

{

int t,c;

bfs_n();

scanf("%d",&t);

while(t--)

{

for(int i = 0; i < 24; i++)

{

scanf("%d",&c);

if(c==10)

start[i] = 'T';

else start[i] = c+'0';

}

if(!strcmp(start,final))

printf("PUZZLE ALREADY SOLVED\n");

else

{

bfs();

memset(b,0,sizeof(b));

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: