AOJ 0121:Seven Puzzle(bfs)

原题地址:点击打开链接

题意:

7数码问题。在2×4的棋盘上,摆有7个棋子,每个棋子上标有1至7的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格(用0表示),与空格相邻(上下左右)的棋子可以移到空格中,该棋子原先位置成为空格。

给出一个初始状态(保证可以转移到最终状态),最终状态为0 1 2 3 4 5 6 7,找出一种从初始状态转变成最终状态的移动棋子步数最少的移动步骤。

输入:

多组输入,每组8个数,表示初始状态前四个数为第一行从左到右,后四个数为第二行从左到右。

输出:

至少需要多少步可以从输入状态到达最终状态

Sample Input

0 1 2 3 4 5 6 7

1 0 2 3 4 5 6 7

7 6 5 4 3 2 1 0

Output for the Sample Input

0

1

28

答案:

#include <stdio.h>
#include <string.h>
#include <queue>
#define MAX_N 100

using namespace std;

char g[MAX_N][9] = {0};	//目标状态
int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1};	//0的移动方向
int dp[8][8][8][8][8][8][8][8];	//保存达到各个状态的最小移动次数
int n;	//输入的最终状态个数 

//各个状态的信息
typedef struct
{
	char d[9];	//状态
	int n;	//移动的次数
	int idx;	//0的位置
}Data;

//保存已经达到的状态的最小移动次数
void SetFlag(char d[], int n)
{
	dp[d[0]-'0'][d[1]-'0'][d[2]-'0'][d[3]-'0'][d[4]-'0'][d[5]-'0'][d[6]-'0'][d[7]-'0'] = n;
}

//获取某个状态的最小移动次数
int GetFlag(char d[])
{
	return dp[d[0]-'0'][d[1]-'0'][d[2]-'0'][d[3]-'0'][d[4]-'0'][d[5]-'0'][d[6]-'0'][d[7]-'0'];
}

//bfs遍历所有可能达到的状态
void bfs()
{
	queue<Data> que;
	Data dt = {"01234567", 0, 0};
	que.push(dt);
	SetFlag(dt.d, 0);

	while(que.size()){
		dt = que.front();
		que.pop();
		int x = dt.idx / 4, y = dt.idx % 4;

		for(int i = 0; i < 4; i ++){
			int nx = x + dx[i], ny = y + dy[i];
			if(nx >= 0 && nx < 2 && ny >= 0 && ny < 4){
				Data ndt = dt;
				ndt.idx = nx * 4 + ny;

				ndt.d[dt.idx] = ndt.d[ndt.idx];
				ndt.d[ndt.idx] = '0';

				if(-1 == GetFlag(ndt.d)){
					SetFlag(ndt.d, ++ ndt.n);
					que.push(ndt);
				}

			}
		}
	}

}

void solve()
{
	memset(dp, -1, sizeof(dp));
	bfs();
	for(int i = 0; i < n; i ++)
		printf("%d\n", GetFlag(g[i]));
}

int main()
{
	scanf("%d", &n);
	for(int ch, i = 0; i < n; i ++)
		for(int j = 0; j < 8; j ++){
			scanf("%d", &ch);
			g[i][j] = ch + '0';
		}
	solve();
	return 0;
}

思路:

可以把01234567看做是起始状态,把输入的看做是最终要达到的状态,因此以01234567为起始状态用bfs搜索所有可能达到的状态,并保存这些状态,然后输出即可;而每次都用bfs则可能会TLE(超时)

时间: 2024-10-27 05:52:04

AOJ 0121:Seven Puzzle(bfs)的相关文章

HDU 1728:逃离迷宫(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1728 逃离迷宫 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去.令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不

HDU 5876:Sparse Graph(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=5876 Sparse Graph Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they are not adjacent in G

迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解

1.问题简介 给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem). 迷宫可以以二维数组来存储表示.0表示通路,1表示障碍.注意这里规定移动可以从上.下.左.右四方方向移动.坐标以行和列表示,均从0开始,给定起点(0,0)和终点(4,4),迷宫表示如下: int maze[5][5]={ {0,0,0,0,0}, {0,1,0,1,0}, {0,1,1,0,0}, {0,1,1,0,1}, {0,0,0,0,0} }; 那么下面的迷宫就有两条

hdu 1026 Ignatius and the Princess I(bfs)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16269    Accepted Submission(s): 5164 Special Judge Problem Description The Princess has been abducted by the BEelzeb

pots(BFS)

D - Pots Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: Input On the first and

USACO抓牛catchcow (bfs)

这题是黄巨大出的比赛题. http://poj.org/problem?id=3278 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤

HDU 1372 Knight Moves (bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10372    Accepted Submission(s): 6105 Problem Description A friend of you is doin

hdu 1728 逃离迷宫 (BFS)

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14376    Accepted Submission(s): 3458 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方

牛汇(BFS)入金具体流程(图文指导)

牛汇开户流程:bfsforex牛汇入金教程 所谓入金,也就是充值的意思,必须充钱到平台才能进行外汇交易.首先,我们先登录bfsforex牛汇官方网站,在交易办公室功能区域下面,点击账户入金: 为您提供中国各大银行的网银支付解决方案,支持人民币支付,和信用卡入金,入金是实时到账的. 牛汇(BFS)入金具体流程(图文指导),布布扣,bubuko.com