struct TrieNode{bool is_end;
TrieNode* links[26];TrieNode(){
is_end =false;memset(links,0,sizeof(links));}};classTrie{public:
TrieNode* root;/** Initialize your data structure here. */Trie(){
root =newTrieNode();}/** Inserts a word into the trie. */voidinsert(string word){
TrieNode* node = root;for(char c : word){if(node->links[c -'a']==NULL)
node->links[c -'a']=newTrieNode();
node = node->links[c -'a'];}
node->is_end =true;// 实际上是结尾的下一个节点, 来判断当前节点是否结尾, 有一个节点的延后}/** Returns if the word is in the trie. */boolsearch(string word){
TrieNode* node = root;for(char c : word){if(node->links[c -'a']==NULL)returnfalse;
node = node->links[c -'a'];}return node->is_end;}/** Returns if there is any word in the trie that starts with the given prefix. */boolstartsWith(string prefix){
TrieNode* node = root;for(char c : prefix){if(node->links[c -'a']==NULL)returnfalse;
node = node->links[c -'a'];}returntrue;}};
上下左右移动
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};// 左,右,上,下移动,例如:{0, -1}代表向左移动一步int x = start.x + dir[i][0];int y = start.y + dir[i][1];
地下迷宫
/**
* 小青蛙有一天不小心落入了一个地下迷宫,
* 小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。
* 为了让问题简单,假设这是一个n*m的格子迷宫,
* 迷宫每个位置为0或者1,0代表这个位置有障碍物,
* 小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。
* 小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),
* 小青蛙在迷宫中水平移动一个单位距离需要消耗1点体力值,
* 向上爬一个单位距离需要消耗3个单位的体力值,
* 向下移动不消耗体力值,当小青蛙的体力值等于0的时候还没有到达出口,
* 小青蛙将无法逃离迷宫。现在需要你帮助小青蛙计算出能否用仅剩的体力值跳出迷宫(即达到(0,m-1)位置)。
*/#include<iostream>#include<vector>#include<queue>#include<set>#include<algorithm>#include<limits.h>usingnamespace std;classPoint{public:int x;int y;Point(int x,int y):x(x),y(y){};booloperator==(const Point& p){return(this->x == p.x)&&(this->y == p.y);}};classCmp{public:booloperator()(const Point& p1,const Point& p2)const{if(p1.x == p2.x)return p1.y < p2.y;return p1.x < p2.x;}};
vector<Point> res;int max_p = INT_MIN;int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}};int cost[4]={-1,-1,-3,0};voidbacktrack(vector<vector<int>> v, vector<Point>& select,int p, Point start , Point target){if(select[select.size()-1]== target && p >=0){if(p > max_p){
res = select;
max_p = p;}return;}if(p <0)return;for(int i =0; i <4; i++){int x = start.x + dir[i][0];int y = start.y + dir[i][1];
Point point(x, y);if(x <0|| x >= v.size()|| y <0|| y >= v[0].size()|| v[x][y]!=1||find(select.begin(), select.end(), point)!= select.end())continue;
select.push_back(point);backtrack(v, select, p + cost[i], point, target);
select.pop_back();}}voidsolution(vector<Point>& select){int n, m, p;
cin>>n>>m>>p;
vector<vector<int>>map(n, vector<int>(m,0));for(int i =0; i < n; i++){for(int j =0; j < m; j++){int val;
cin>>val;
map[i][j]= val;}}
select.push_back(Point(0,0));backtrack(map, select, p,Point(0,0),Point(0, m-1));}intmain(){
vector<Point> s;solution(s);if(res.size()==0)
cout<<"Can not escape!"<<endl;else{for(int i =0; i < res.size()-1; i++){
cout<<"["<<res[i].x<<","<<res[i].y<<"],";}
cout<<"["<<res[res.size()-1].x<<","<<res[res.size()-1].y<<"]";}return0;}