你玩过华容道的游戏吗? 这是个类似的,但更简单的游戏。 看下面 3 x 2 的格子
±–±--±–+ | A | * | * | ±–±--±–+ | B | | * | ±–±--±–+ 在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。 还有一个格子是空着的。 你可以把一张牌移动到相邻的空格中去(对角不算相邻)。 游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式
输入两行6个字符表示当前的局面
输出格式
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
输入样例
在提交之后,系统测试系统给我爆出了有一个测试用例不通过,我打开看了一下,发现是这个测试用例的错误。它的测试用例是没有给空格,而题目中说有一个格子是空着的。这就是那个测试用例:
*A*
*B*
而正确的应该是:
*A
*B*
输出样例
10
代码
在这道题目中,难点就是在二维数组向着不同方向转化时,怎么去记录二维数组的情况。 还有,这道题只要求A和B的位置实现互换,不考虑其他牌的情况。
#include <iostream>
#include <stdio.h>
#include <map>
#include <string>
#include <queue>
using namespace std;
struct Node
{
int x;
int y;
int ax;
int ay;
int bx;
int by;
int step;
string s;
};
char str[2][3];
int Ax,Ay,Bx,By,spaceX,spaceY;
int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
map<string, bool> mp;
void bfs()
{
Node start;
start.x = spaceX;
start.y = spaceY;
start.ax = Ax;
start.ay = Ay;
start.bx = Bx;
start.by = By;
start.step = 0;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
start.s += str[i][j];
}
}
queue<Node> q;
q.push(start);
mp[start.s] = true;
while(!q.empty())
{
Node now = q.front();
q.pop();
int step = now.step;
if(now.bx == Ax && now.by == Ay &&
now.ax == Bx && now.ay == By)
{
cout<<step<<endl;
return;
}
char Str[2][3];
int count = 0;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
Str[i][j] = now.s[count];
count++;
}
}
for(int i=0;i<4;i++)
{
char helpStr[2][3];
for (int row = 0; row < 2; row++)
{
for (int col = 0; col < 3; col++)
{
helpStr[row][col] = Str[row][col];
}
}
Node next;
next.x = now.x + dir[i][0];
next.y = now.y + dir[i][1];
if(next.x>=0 && next.x<2 &&
next.y>=0 && next.y<3)
{
if(helpStr[next.x][next.y] == '*')
{
char tmp = helpStr[next.x][next.y];
helpStr[next.x][next.y] = helpStr[now.x][now.y];
helpStr[now.x][now.y] = tmp;
next.ax = now.ax;
next.ay = now.ay;
next.bx = now.bx;
next.by = now.by;
next.step = now.step+1;
}
if(helpStr[next.x][next.y] == 'A')
{
char tmp = helpStr[next.x][next.y];
helpStr[next.x][next.y] = helpStr[now.x][now.y];
helpStr[now.x][now.y] = tmp;
next.ax = now.x;
next.ay = now.y;
next.bx = now.bx;
next.by = now.by;
next.step = now.step+1;
}
if(helpStr[next.x][next.y] == 'B')
{
char tmp = helpStr[next.x][next.y];
helpStr[next.x][next.y] = helpStr[now.x][now.y];
helpStr[now.x][now.y] = tmp;
next.bx = now.x;
next.by = now.y;
next.ax = now.ax;
next.ay = now.ay;
next.step = now.step+1;
}
string news = "";
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
news += helpStr[i][j];
}
}
if(!mp[news])
{
mp[news] = true;
next.s = news;
q.push(next);
}
}
}
}
}
int main()
{
for(int i=0; i<2; i++)
{
gets(str[i]);
}
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
if(str[i][j] == 'A')
{
Ax = i;
Ay = j;
}
if(str[i][j] == 'B')
{
Bx = i;
By = j;
}
if(str[i][j] == ' ')
{
spaceX = i;
spaceY = j;
}
}
}
bfs();
return 0;
}
|