你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
±–±--±–+
| A | * | * |
±–±--±–+
| B | | * |
±–±--±–+
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。
输入格式:
输入两行6个字符表示当前的局面
输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
例如,输入:
- A
**B
程序应该输出:
17
再例如,输入:
A B
程序应该输出:
12
这种题目一般都是用BFS来写的,但最近刚开始学广搜和深搜,就尝试用两种方法都实现了一下先贴出DFS的代码
#include<string>
#include<iostream>
#include<map>
using namespace std;
string des;
int minn = 10000000;
map<string,int> mp;
int go[6][4] = { {10,3,10,1},{10,4,0,2},{10,5,1,10},{0,10,10,4},{1,10,3,5},{2,10,4,10} }; //上下左右
int main()
{
string s,tmp;
bool equal(string a,string b);
string swap(string a, int x, int y);
void dfs(string k, int step);
while (getline(cin, s))
{
getline(cin, tmp);
s = s + tmp;
int posa, posb; //posa,posb为A,B的位置
posa = s.find('A');
posb = s.find('B');
des = swap(s, posa, posb); //得到目标状态
dfs(s, 0);
cout << minn << endl;
}
return 0;
}
void dfs(string k, int step)
{
string swap(string a, int x, int y);
bool equal(string a,string b);
if(step>minn) return;
if (equal(k,des))
{
minn = step;
return;
}
mp[k] = 1;
int pos = k.find(' ');
for (int i = 0; i < 4; ++i)
{
if (go[pos][i] != 10) {
string ne = swap(k, pos, go[pos][i]);
if(mp[ne]==0)
dfs(ne, step + 1);
/*cout << ne << endl;
cout << go[pos][i] << endl;
cout << k << endl;*/
}
}
mp[k] = 0;
return;
}
string swap(string a, int x, int y)
{
char tmp = a[x];
a[x] = a[y];
a[y] = tmp;
return a;
}
bool equal(string a,string b)
{
int x=a.find('A');
int y=a.find('B');
if(x==b.find('A')&&y==b.find('B')) return true;
else return false;
}
再给出bfs的算法,需要借助队列数据结构
#include<string>
#include<iostream>
#include<map>
#include<queue>
using namespace std;
string des;
map<string,int> book;
map<string,int> step;
int go[6][4] = { {10,3,10,1},{10,4,0,2},{10,5,1,10},{0,10,10,4},{1,10,3,5},{2,10,4,10} }; //上下左右
int main()
{
string s,tmp;
bool equal(string a,string b);
string swap(string a, int x, int y);
int bfs(string k);
while (getline(cin, s))
{
getline(cin, tmp);
s = s + tmp;
int posa, posb; //posa,posb为A,B的位置
posa = s.find('A');
posb = s.find('B');
des = swap(s, posa, posb); //得到目标状态
cout<<bfs(s)<<endl;
}
return 0;
}
int bfs(string k)
{
string swap(string a, int x, int y);
bool equal(string a,string b);
queue<string> q;
book.clear();
step.clear();
q.push(k);
book[k]=1;
step[k]=0;
while(!q.empty())
{
string fir=q.front();
q.pop();
if(equal(des,fir)) return step[fir];
int pos=fir.find(' '); //pos即为0的位置
for(int i=0;i<4;++i)
{
string next=swap(fir,go[pos][i],pos);
if(book[next]==0){
q.push(next);
book[next]=1;
step[next]=step[fir]+1;
}
}
}
}
string swap(string a, int x, int y)
{
char tmp = a[x];
a[x] = a[y];
a[y] = tmp;
return a;
}
bool equal(string a,string b)
{
int x=a.find('A');
int y=a.find('B');
if(x==b.find('A')&&y==b.find('B')) return true;
else return false;
}