题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072
从入口到出口的最短路,4这个点要重置时间,不运行重复走,其他个点可以重复走,其中0是障碍,先前自己用深度优先不好搞,再借鉴了网上一个大牛的
转自:http://blog.csdn.net/yyf573462811/article/details/7819226
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <vector> #include <algorithm> #include <sstream> #include <cstdlib> #include <fstream> #include <queue> using namespace std; int maze[20][20]; struct node { int x,y,step,count; }p,q; int n,m,sx,sy; int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; void bfs() { queue<node> Q; p.x=sx; p.y=sy; p.step=0; p.count=6; maze[sx][sy]=0; Q.push(p); while(!Q.empty()) { p=Q.front(); Q.pop(); for(int i=0;i<4;i++) { q=p; q.x+=dir[i][0]; q.y+=dir[i][1]; if(q.x<=0||q.x>n||q.y<=0||q.y>m||maze[q.x][q.y]==0)continue; if(maze[q.x][q.y]==1){ q.count--; if(q.count>=1){ q.step++; Q.push(q); } // maze[q.x][q.y]=0; 如果不允许重复,则最后一个数据无法到达 } else if(maze[q.x][q.y]==4){ q.count--; if(q.count>=1){ q.step++; q.count=6; Q.push(q); } maze[q.x][q.y]=0; //只有4这点不能重复走,其他可重复走 } else if(maze[q.x][q.y]==3&&q.count>1){ q.step++; cout<<q.step<<endl; return ; } } } cout<<-1<<endl; } int main() { int t; // ifstream fin; // fin.open("data1.txt"); cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>maze[i][j]; if(maze[i][j]==2){ sx=i; sy=j; } } } bfs(); } return 0; }