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

Re:这个题目好难,不敢下手,有没思路详细点的

Posted by goodpeter at 2007-08-22 10:34:51 on Problem 1184
In Reply To:这个题目好难,不敢下手,有没思路详细点的 Posted by:goodpeter at 2007-08-19 01:30:47
#include <iostream>
#include <queue>
using namespace std;

typedef struct{
	int num[6];
	int pos;
	int step;
}code;

queue<code> q;
bool app[7][10][10][10][10][10][10];//用来判重的
int final[6];
int i;
code newone;
int u, v;
int best;

bool cmp(int a[6], int b[6])
{
	int i;
	for(i = 0; i < 6; i++)
	{
		if(a[i] != b[i])
		{
			return false;
		}
	}
	return true;
}

int main()
{
	code start;
    for(i = 0; i < 6; i++)
	{
		char a;
		cin>>a;
		start.num[i] = (int)(a - '0');
	}
	start.pos = 1;
	start.step = 1;

	q.push(start);

	memset(app, false, sizeof(app));

    for(i = 0; i < 6; i++)
	{
		char b;
		cin>>b;
		final[i] = (int)(b - '0');
	}

	while(!q.empty())
	{
		code temp = q.front();
		q.pop();
		if(cmp(temp.num, final))
		{
			best = temp.step;
			break;
		}

		int tmppos = temp.pos;
		if((tmppos > 1) && !app[tmppos - 1][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
		{
			for(i = 0; i < 6; i++)
			{
				newone.num[i] = temp.num[i];
			}
			newone.step = temp.step + 1;
			newone.pos = tmppos - 1;
            app[tmppos - 1][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
			q.push(newone);
		}

		if((tmppos < 6) && !app[tmppos + 1][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
		{
			for(i = 0; i < 6; i++)
			{
				newone.num[i] = temp.num[i];
			}
			newone.step = temp.step + 1;
			newone.pos = tmppos + 1;
            app[tmppos + 1][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
			q.push(newone);
		}

		if(temp.num[tmppos] > 0)
		{
			temp.num[tmppos] = temp.num[tmppos] - 1;
			if(!app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
			{
				for(i = 0; i < 6; i++)
				{
					newone.num[i] = temp.num[i];
				}
				newone.step = temp.step + 1;
				newone.pos = tmppos;
				app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
				q.push(newone);
			}
			temp.num[tmppos] = temp.num[tmppos] + 1;
		}

		if(temp.num[tmppos] < 9)
		{
			temp.num[tmppos] = temp.num[tmppos] + 1;
			if(!app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
			{
				for(i = 0; i < 6; i++)
				{
					newone.num[i] = temp.num[i];
				}
				newone.step = temp.step + 1;
				newone.pos = tmppos;
				app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
				q.push(newone);
			}
			temp.num[tmppos] = temp.num[tmppos] - 1;
		}
        
		u = temp.num[tmppos];
		v = temp.num[0];
        temp.num[0] = u;
        temp.num[tmppos] = v;

	    if(!app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
	    {
			for(i = 0; i < 6; i++)
			{
				newone.num[i] = temp.num[i];
			}
			newone.step = temp.step + 1;
			newone.pos = tmppos;
			app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
			q.push(newone);
		}
        temp.num[0] = v;
        temp.num[tmppos] = temp.num[5];
		temp.num[5] = u;
		if(!app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]])
	    {
			for(i = 0; i < 6; i++)
			{
				newone.num[i] = temp.num[i];
			}
			newone.step = temp.step + 1;
			newone.pos = tmppos;
			app[tmppos][temp.num[0]][temp.num[1]][temp.num[2]][temp.num[3]][temp.num[4]][temp.num[5]] = true;
			q.push(newone);
		}
	}

	cout<<best<<endl;
	return 0;
}

我的程序tle,不知怎么优化,谁能帮我看看?

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