目录
迷宫
走到右下角最短路径长度
走到右下角最短路径
跨步迷宫
迷宫
走到右下角最短路径长度
我是和上一篇一样,创建一个队列,不过while 里面判责是queue非空,否则会死循环万一是死路的话。
也是要判断不要重复入队。
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=102,maxn=10;int n,m;
int W[N][N];
int row[]={0,0,1,-1};
int col[]={1,-1,0,0};
struct point
{int x;int y;} p;point pre[N][N];
queue<point> q;
int bushu[N][N];
bool inq[N][N]={0};int T=0;
int bfs()
{p.x=0;p.y=0;q.push(p);//printf("?");inq[0][0]=1;while(!q.empty()){int c=q.size(); // printf("?%d?",c);for(int i=0;i<c;i++){ // printf("!*");int x1=q.front().x;int y1=q.front().y;
//printf("%d%d%d\n",x2,y2,W[x2][y2]);for(int j=0;j<4;j++)//艹,一开始写的i<4,找死了。 {//printf("j=%d\n",j);int x2=x1+row[j];int y2=y1+col[j];//printf("%d%d%d\n",x2,y2,W[x2][y2]);if(x2>=0 && y2>=0 && x2<n && y2<m && !W[x2][y2] && !inq[x2][y2]) {p.x=x2;p.y=y2;q.push(p);inq[x2][y2]=1;//printf("x2y2$%d %d %d=\n",x2,y2,T);if(!bushu[x2][y2]){bushu[x2][y2]=T+1;pre[x2][y2]=q.front();}if(x2==n-1 && y2==m-1){ //printf("#x2=%d y2=%d,T=%d\n#",x2,y2,T);return T+1; } }}q.pop();}T++;//printf("T=%d\n!",T);}
return -1;
}int main()
{//D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&W[i][j]);}
//int ans=0;
//for(int i=0;i<n;i++)
//{for(int j=0;j<m;j++)
//{
// if(can(i,j))
// {//printf("^");
// bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);
// }
//}
printf("%d",bfs());//for(int i=0;i<n;i++)
//for(int j=0;j<m;j++)
//printf("%d " ,bushu[i][j]);
//printf("%d",bushu[n-1][m-1]);
}
走到右下角最短路径
我用了一个先进后出的vector<point>,point是我自己造的结构体,每个点记录上一个点的point值,类似于动态规划的局部最优。
tips:如何取出vector的末尾元素?
声明:vector<T> vec;
方法一: return vec.at(vec.size()-1);
方法二: return vec.back();
方法三: return vec.end()-1; 注意:end指向末尾元素的下一个元素。
方法四: return vec.rbegin();
方法五: return std::end(vec)-1;
方法六: return std::rbegin(vec);
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=102,maxn=10;int n,m;
int W[N][N];
int row[]={0,0,1,-1};
int col[]={1,-1,0,0};
struct point
{int x;int y;} p;point pre[N][N];
queue<point> q;
int bushu[N][N];
bool inq[N][N]={0};int T=0;
void bfs()
{p.x=0;p.y=0;q.push(p);//printf("?");inq[0][0]=1;while(!q.empty()){int c=q.size(); // printf("?%d?",c);for(int i=0;i<c;i++){ // printf("!*");int x1=q.front().x;int y1=q.front().y;
//printf("%d%d%d\n",x2,y2,W[x2][y2]);for(int j=0;j<4;j++)//艹,一开始写的i<4,找死了。 {//printf("j=%d\n",j);int x2=x1+row[j];int y2=y1+col[j];//printf("%d%d%d\n",x2,y2,W[x2][y2]);if(x2>=0 && y2>=0 && x2<n && y2<m && !W[x2][y2] && !inq[x2][y2]) {p.x=x2;p.y=y2;q.push(p);inq[x2][y2]=1;//printf("x2y2$%d %d %d=\n",x2,y2,T);if(!bushu[x2][y2]){bushu[x2][y2]=T+1;pre[x2][y2]=q.front();}if(x2==n-1 && y2==m-1){ //printf("#x2=%d y2=%d,T=%d\n#",x2,y2,T);return ; } }}q.pop();}T++;//printf("T=%d\n!",T);}
return ;
}int main()
{//D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&W[i][j]);}
//int ans=0;
//for(int i=0;i<n;i++)
//{for(int j=0;j<m;j++)
//{
// if(can(i,j))
// {//printf("^");
// bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);
// }
//}
//printf("%d",bfs());
bfs();
point p0;
vector<point> path;
p0.x=n-1;p0.y=m-1;
path.push_back(p0);
while (p0.x || p0.y)
{int x=p0.x;int y=p0.y;p0.x=pre[x][y].x;p0.y=pre[x][y].y;
// printf("_%d%d_\n",p0.x,p0.y);path.push_back(p0);
}while(!path.empty())
{printf("%d %d",path.back().x+1,path.back().y+1);path.pop_back();if(!path.empty()) printf("\n");
}//for(int i=0;i<n;i++)
//for(int j=0;j<m;j++)
//printf("%d " ,bushu[i][j]);
//printf("%d",bushu[n-1][m-1]);
}
答案用的是递归print path
void printPath(Position p) {Position prePosition = pre[p.first][p.second];if (prePosition == Position(-1, -1)) {printf("%d %d\n", p.first + 1, p.second + 1);return;}printPath(prePosition);printf("%d %d\n", p.first + 1, p.second + 1);
}
跨步迷宫
可以走两步,没什么好说的,加上取中点验证 ,但是我把后面一段放到if'外面了,检查了半天,ε=(´ο`*)))唉
#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=102,maxn=10;int n,m;
int W[N][N];
int row[]={0,0,0,0,1,-1,2,-2};
int col[]={1,-1,2,-2,0,0,0,0};
struct point
{int x;int y;} p;point pre[N][N];
queue<point> q;
int bushu[N][N];
bool inq[N][N]={0};int T=0;
int bfs()
{p.x=0;p.y=0;q.push(p);//printf("?");inq[0][0]=1;while(!q.empty()){int c=q.size(); // printf("?%d?",c);for(int i=0;i<c;i++){ // printf("!*");int x1=q.front().x;int y1=q.front().y;
//printf("%d%d%d\n",x2,y2,W[x2][y2]);for(int j=0;j<8;j++)//艹,一开始写的i<4,找死了。 {//printf("j=%d\n",j);int x2=x1+row[j];int y2=y1+col[j];//printf("%d%d%d\n",x2,y2,W[x2][y2]);if(x2>=0 && y2>=0 && x2<n && y2<m && !W[x2][y2] && !inq[x2][y2]) {int flag=1;if(abs(row[j])==2) if(W[(x2+x1)/2][y2]) flag=0;if(abs(col[j])==2) if(W[x2][(y2+y1)/2]) flag=0;// printf("%d %d %d %d %d %d %d\n\n",x2,y2,x2,y1,W[(x2+x1)/2][y2],W[x2][(y2+y1)/2],flag);if(flag){ p.x=x2;p.y=y2;q.push(p);inq[x2][y2]=1;if(!bushu[x2][y2]){bushu[x2][y2]=T+1;pre[x2][y2]=q.front();}if(x2==n-1 && y2==m-1){ //printf("#x2=%d y2=%d,T=%d\n#",x2,y2,T);return T+1; } }//printf("x2y2$%d %d %d=\n",x2,y2,T);}}q.pop();}T++;//printf("T=%d\n!",T);}
return -1;
}int main()
{//D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&W[i][j]);}
//int ans=0;
//for(int i=0;i<n;i++)
//{for(int j=0;j<m;j++)
//{
// if(can(i,j))
// {//printf("^");
// bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);
// }
//}
printf("%d",bfs());
//bfs();printf("%d",bushu[n-1][m-1]);
point p0;
vector<point> path;
p0.x=n-1;p0.y=m-1;
//path.push_back(p0);
//while (p0.x || p0.y)
//{
// int x=p0.x;int y=p0.y;
// p0.x=pre[x][y].x;p0.y=pre[x][y].y;printf("_%d%d_\n",p0.x,p0.y);
// path.push_back(p0);
//}
//
//
//while(!path.empty())
//{
// printf("%d %d",path.back().x+1,path.back().y+1);
// path.pop_back();
// if(!path.empty()) printf("\n");
//}//for(int i=0;i<n;i++)
//for(int j=0;j<m;j++)
//printf("%d " ,bushu[i][j]);
//printf("%d",bushu[n-1][m-1]);
}
还有走马字的,懒得写了,就是判断条件改来改去的。