将结点坐标进行哈希运算,生成每个结点的哈希值,例如坐标 (1,2,3) 的哈希值为 123(哈希方法可自行选择,生成唯一的整数哈希值即可),然后从起点到终点进行深搜。(活用 map、vector、set 等数据结构可大大提高解题效率)
#include <iostream>
#include <map>
#include <vector>
#include <set>
using namespace std;
map<int, vector<int>> mp; //存储各结点之间的连接关系
set<int> st; //存储搜索过的结点的哈希值
int n; //维数
//判断输入是否终止,如果输入有效,计算其哈希值
bool hashInput(int& num)
{
num = 0;
int temp;
for (int i = 0; i < n; i++)
{
cin >> temp;
if (temp == -1)
return false;
num = num * 10 + temp; //哈希运算
}
return true;
}
//深搜,查找结点s和结点e之间有无路径
bool DFS(int s, int e)
{
if (s == e) //到达终点
return true;
for (int i = 0; i < mp[s].size(); i++) //依次对结点s的连接点进行深搜
{
int temp = mp[s][i];
if (st.count(temp) == 0) //结点temp没有被搜索过
{
st.insert(temp);
if (DFS(temp, e))
return true;
}
}
return false;
}
int main()
{
int Case = 0; //测试用例组数
int start, end; //起点哈希值,终点哈希值
while (cin >> n)
{
if (n == 0)
break;
mp.clear();
st.clear();
hashInput(start);
hashInput(end);
int u, v;
while (hashInput(u))
{
hashInput(v);
mp[u].push_back(v); //添加u->v的连线
mp[v].push_back(u); //添加v->u的连线
}
if (DFS(start, end))
cout << "Maze #" << ++Case << " can be travelled" << endl;
else
cout << "Maze #" << ++Case << " cannot be travelled" << endl;
}
return 0;
}
继续加油。