首页 > 代码库 > Hdu1072广搜
Hdu1072广搜
题意:0不能走,1可以走,2起始位置,3中点,4时间变成6.初始时间为6 走到终点或者4时时间不能为0.问能否走到终点和 到终点的最短距离。
反正时间就是6 ,每个点可以重复走,随便走就行。剪纸 就是 经过4这个点只要经过一次,第二次经过这个点的路程一定比第一次经过的长 并且都重置了时间。
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>#include <stack>#include <queue>#include <vector>#include <map>#include <string>#include <iostream>using namespace std;const int maxn = 8;int Map[maxn][maxn];int n,m;int bx,ex,by,ey;int dx[]={0,0,-1,1};int dy[]={-1,1,0,0};struct Node{ int x;int y;int time;int dist;};int gao(int x,int y){ if(x>=0&&x<n&&y>=0&&y<m&&Map[x][y]) return 1; return 0;}int dfs(){ queue<Node> q; Node t ; t.x= bx;t.y=by; t.time= 6; t.dist= 0; q.push(t); while(!q.empty()){ Node cur=q.front(); q.pop(); if(cur.x==ex&&cur.y==ey) return cur.dist; if(cur.time<=1) continue; for(int i=0;i<4;i++){ int xx= cur.x+dx[i];int yy=cur.y+dy[i]; if(!gao(xx,yy)) continue; Node gg; gg.x= xx ;gg.y= yy; gg.dist= cur.dist+1; gg.time = cur.time- 1; if(Map[xx][yy]==4){ Map[xx][yy]=0;gg.time = 6; } q.push(gg); } } return -1;}int main(){ int Icase; cin>>Icase; while(Icase--){ cin>>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&Map[i][j]); if(Map[i][j] ==2) bx = i ,by = j; if(Map[i][j]==3) ex = i ,ey = j; } } printf("%d\n",dfs()); } return 0;}
Hdu1072广搜
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。