uva 10085 The most distant state

没有什么好的办法,广搜遍历状态树,最后一个状态就是答案,运行都3s多了居然还可以过,这道题好像没什么意义啊,没看出这道题的价值在哪。

#include <stdio.h>
#include <queue>
#include <set>
#include <string.h>
using namespace std;

struct state
{
	int blank_i, blank_j;
	char m[4][4];
	int step;
	char solution[100];
};

int _hash(const struct state &sta)
{
	int sum;
	int cifang;

	cifang = 1;
	sum = 0;
	for(int i=1; i<=3; i++)
	{
		for(int j=1; j<=3; j++)
		{
			sum += sta.m[i][j]*cifang;
			cifang *= 10;
		}
	}

	return sum;
}

queue<struct state> pq;
set<int> visited;

struct state result;
void bfs()
{
	struct state sta, sta_top;
	int hv;

	while(!pq.empty())
	{
		memcpy(&sta_top, &(pq.front()), sizeof(struct state));
		pq.pop();
		//printf("step=%d\n", sta_top.step);

		if(pq.empty() && sta_top.step!=0)
		{
			memcpy(&result, &sta_top, sizeof(struct state));
			result.solution[result.step+1] = '\0';
			break;
		}

		memcpy(&sta, &sta_top, sizeof(struct state));
		if(sta.blank_i >= 2)
		{
			sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i-1][sta.blank_j];
			sta.m[sta.blank_i-1][sta.blank_j] = 0;
			hv = _hash(sta);
			if(visited.find(hv) == visited.end())
			{
				sta.blank_i--;
				sta.step++;
				sta.solution[sta.step] = 'U';
				visited.insert(hv);
				pq.push(sta);
			}
		}

		memcpy(&sta, &sta_top, sizeof(struct state));
		if(sta.blank_i <= 2)
		{
			sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i+1][sta.blank_j];
			sta.m[sta.blank_i+1][sta.blank_j] = 0;
			hv = _hash(sta);
			if(visited.find(hv) == visited.end())
			{
				sta.blank_i++;
				sta.step++;
				sta.solution[sta.step] = 'D';
				visited.insert(hv);
				pq.push(sta);
			}
		}

		memcpy(&sta, &sta_top, sizeof(struct state));
		if(sta.blank_j >= 2)
		{
			sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i][sta.blank_j-1];
			sta.m[sta.blank_i][sta.blank_j-1] = 0;
			hv = _hash(sta);
			if(visited.find(hv) == visited.end())
			{
				sta.blank_j--;
				sta.step++;
				sta.solution[sta.step] = 'L';
				visited.insert(hv);
				pq.push(sta);
			}
		}

		memcpy(&sta, &sta_top, sizeof(struct state));
		if(sta.blank_j <= 2)
		{
			sta.m[sta.blank_i][sta.blank_j] = sta.m[sta.blank_i][sta.blank_j+1];
			sta.m[sta.blank_i][sta.blank_j+1] = 0;
			hv = _hash(sta);
			if(visited.find(hv) == visited.end())
			{
				sta.blank_j++;
				sta.step++;
				sta.solution[sta.step] = 'R';
				visited.insert(hv);
				pq.push(sta);
			}
		}
	}
}

void func(int case_count, const struct state &sta)
{
	int hv;

	visited.clear();
	while(!pq.empty()) pq.pop();

	hv = _hash(sta);
	visited.insert(hv);
	pq.push(sta);

	bfs();
	printf("Puzzle #%d\n", case_count);
	for(int i=1; i<=3; i++)
		printf("%d %d %d\n", result.m[i][1], result.m[i][2], result.m[i][3]);
	printf("%s\n\n", result.solution+1);
}

char buf[100];
int main(void)
{
	int n, i, j;
	int ii, jj;
	struct state sta;

	//freopen("input.dat", "r", stdin);

	gets(buf);
	sscanf(buf, "%d", &n);
	for(i=1; i<=n; i++)
	{
		gets(buf);
		for(j=1; j<=3; j++)
		{
			gets(buf);
			sscanf(buf, "%d %d %d", &(sta.m[j][1]), &(sta.m[j][2]), &(sta.m[j][3]));
		}

		for(ii=1; ii<=3; ii++)
		{
			for(jj=1; jj<=3; jj++)
			{
				if(sta.m[ii][jj] == 0)
				{
					sta.blank_i = ii;
					sta.blank_j = jj;
					goto run_func;
				}
			}
		}

	run_func:
		sta.step = 0;
		func(i, sta);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值