Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我很水,第一次写图的算法,在网上看了下广度搜索,然后就写了这个很搓很搓的程序.至于说搓到什么程度!!!题目中的测试数据我跑了1分多钟才跑出结果.可以输出每一步的结果,答案是对的.

Posted by CUG20071003560 at 2010-08-09 15:31:15 on Problem 1077
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator