| ||||||||||
| 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 | |||||||||
我很水,第一次写图的算法,在网上看了下广度搜索,然后就写了这个很搓很搓的程序.至于说搓到什么程度!!!题目中的测试数据我跑了1分多钟才跑出结果.可以输出每一步的结果,答案是对的.In Reply To:求代码 Posted by:caizixian at 2010-07-29 20:50:38 我很水,第一次写图的算法,在网上看了下广度搜索,然后就写了这个很搓很搓的程序.至于说搓到什么程度!!!题目中的测试数据我跑了1分多钟才跑出结果.可以输出每一步的结果,答案是对的.
#include <stdio.h>
#include <string.h>
struct GRAPH
{
int g[3][3];
int oi,oj;
int father;
char path;
};
struct QUEUE
{
GRAPH node[362881];
int top;
};
char paths[100];
GRAPH final;
QUEUE queue;
int eque(GRAPH g1,GRAPH g2)
{
int i,j;
if(g1.oi != g2.oi || g1.oj != g2.oj)
return 0;
else
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(g1.g[i][j] != g2.g[i][j])
return 0;
}
return 1;
}
int move(GRAPH graph,int n)
{
GRAPH temp[4];
int num;
int i,j,k,m;
for(i=0;i<4;i++)
{
temp[i] = graph;
temp[i].father = n;
}
if(graph.oi == 0 && graph.oj==0)
{
temp[0].g[0][0] = temp[0].g[0][1];
temp[0].g[0][1] = 0;
temp[0].oj=1;
temp[0].path = 'r';
temp[1].g[0][0] = temp[1].g[1][0];
temp[1].g[1][0] = 0;
temp[1].oi = 1;
temp[1].path = 'd';
num = 2;
}
else if(graph.oi ==0 && graph.oj==1)
{
temp[0].g[0][1] = temp[0].g[0][0];
temp[0].g[0][0] = 0;
temp[0].oj=0;
temp[0].path = 'l';
temp[1].g[0][1] = temp[1].g[0][2];
temp[1].g[0][2] = 0;
temp[1].oj = 2;
temp[1].path = 'r';
temp[2].g[0][1] = temp[2].g[1][1];
temp[2].g[1][1] = 0;
temp[2].oi = 1;
temp[2].path = 'd';
num = 3;
}
else if(graph.oi ==0 && graph.oj==2)
{
temp[0].g[0][2] = temp[0].g[0][1];
temp[0].g[0][1] = 0;
temp[0].oj=1;
temp[0].path = 'l';
temp[1].g[0][2] = temp[1].g[1][2];
temp[1].g[1][2] = 0;
temp[1].oi = 1;
temp[1].path = 'd';
num = 2;
}
else if(graph.oi == 1 && graph.oj==0)
{
temp[0].g[1][0] = temp[0].g[0][0];
temp[0].g[0][0] = 0;
temp[0].oi=0;
temp[0].path = 'u';
temp[1].g[1][0] = temp[1].g[2][0];
temp[1].g[2][0] = 0;
temp[1].oi = 2;
temp[1].path = 'd';
temp[2].g[1][0] = temp[0].g[1][1];
temp[2].g[1][1] = 0;
temp[2].oj=1;
temp[2].path = 'r';
num = 3;
}
else if(graph.oi == 1 && graph.oj==1)
{
temp[0].g[1][1] = temp[0].g[0][1];
temp[0].g[0][1] = 0;
temp[0].oi=0;
temp[0].path = 'u';
temp[1].g[1][1] = temp[1].g[1][0];
temp[1].g[1][0] = 0;
temp[1].oj = 0;
temp[1].path = 'l';
temp[2].g[1][1] = temp[0].g[1][2];
temp[2].g[1][2] = 0;
temp[2].oj=2;
temp[2].path = 'r';
temp[3].g[1][1] = temp[0].g[2][1];
temp[3].g[2][1] = 0;
temp[3].oi=2;
temp[3].path = 'd';
num = 4;
}
else if(graph.oi == 1 && graph.oj==2)
{
temp[0].g[1][2] = temp[0].g[0][2];
temp[0].g[0][2] = 0;
temp[0].oi=0;
temp[0].path = 'u';
temp[1].g[1][2] = temp[1].g[2][2];
temp[1].g[2][2] = 0;
temp[1].oi = 2;
temp[1].path = 'd';
temp[2].g[1][2] = temp[0].g[1][1];
temp[2].g[1][1] = 0;
temp[2].oj=1;
temp[2].path = 'l';
num = 3;
}
else if(graph.oi ==2 && graph.oj==0)
{
temp[0].g[2][0] = temp[0].g[1][0];
temp[0].g[1][0] = 0;
temp[0].oi=1;
temp[0].path = 'u';
temp[1].g[2][0] = temp[1].g[2][1];
temp[1].g[2][1] = 0;
temp[1].oj = 1;
temp[1].path = 'r';
num = 2;
}
else if(graph.oi == 2 && graph.oj==1)
{
temp[0].g[2][1] = temp[0].g[2][0];
temp[0].g[2][0] = 0;
temp[0].oj=0;
temp[0].path = 'l';
temp[1].g[2][1] = temp[1].g[2][2];
temp[1].g[2][2] = 0;
temp[1].oj = 2;
temp[1].path = 'r';
temp[2].g[2][1] = temp[0].g[1][1];
temp[2].g[1][1] = 0;
temp[2].oi=1;
temp[2].path = 'u';
num = 3;
}
else if(graph.oi == 2 && graph.oj==2)
{
temp[0].g[2][2] = temp[0].g[2][1];
temp[0].g[2][1] = 0;
temp[0].oj=1;
temp[0].path = 'l';
temp[1].g[2][2] = temp[1].g[1][2];
temp[1].g[1][2] = 0;
temp[1].oi = 1;
temp[1].path = 'u';
num = 2;
}
if(queue.top == 362881)
{
printf("exit!!!\n");
return 0;
}
int preTop = queue.top;
for(k=0;k<num;k++)
{
for(m=0;m<queue.top;m++)
if(eque(temp[k],queue.node[m])==1)
break;
if(m==queue.top)
queue.node[queue.top++] = temp[k];
}
for(k=preTop;k<queue.top;k++)
{
if(eque(queue.node[k],final))
{
int p=0;
while(queue.node[k].father != -1)
{
/* for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",queue.node[k].g[i][j]);
printf("\n");
}
printf("\n");*/
paths[p++] = queue.node[k].path;
queue.node[k] = queue.node[queue.node[k].father];
}
return 1;
}
}
return 0;
}
//2 3 4 1 5 x 7 6 8
//1 2 3 x 4 6 7 5 8
int pop()
{
int i;
for(i=0;i<queue.top-1;i++)
queue.node[i] = queue.node[i+1];
queue.top--;
return 1;
}
bool BFS()
{
int i=0;
while(i >=0 && i <362881 && i<queue.top)
{
if(move(queue.node[i],i))
break;
i++;
}
return true;
}
int main()
{
int i,j,k=1;
char s[10];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
final.g[i][j] = k++;
final.g[2][2] =0;
final.oi = 2;
final.oj = 2;
GRAPH graph;
for(i=0;i<9;i++)
{
scanf("%c",&s[i]);
if(i<8)
{
getchar();
getchar();
}
if(s[i]=='x')
{
s[i] = '0';
graph.oi = i/3;
graph.oj = i%3;
}
graph.g[i/3][i%3] = s[i]-'0';
}
graph.father = -1;
queue.node[0] = graph;
queue.top = 1;
/* for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",final.g[i][j]);
printf("\n");
}
printf("\n");*/
BFS();
int len = strlen(paths);
for(i=len-1;i>=0;i--)
printf("%c",paths[i]);
printf("\n");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator