首页 > 代码库 > UVA 1600 Patrol Robot
UVA 1600 Patrol Robot
带状态的bfs
用一个数(ks)来表示状态-当前连续穿越的障碍数;
step表示当前走过的步数;
visit数组也加一个状态;
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 30 ; 8 9 struct node {10 int x,y;11 int step;12 int ks;13 void init (int nx,int ny,int nstep,int nks){14 x=nx;y=ny;step=nstep;ks=nks;15 }16 };17 18 int n,m,k;19 int map[maxn][maxn],visit[maxn][maxn][maxn];20 int dir[4][2]={1,0,-1,0,0,1,0,-1};21 22 int bfs (){23 queue<node> q;24 while (!q.empty ())25 q.pop ();26 node a,b;27 a.init (1,1,0,0);28 q.push (a);29 while (!q.empty ()){30 a=q.front ();31 q.pop ();32 33 int xx,yy,sstep,kss;34 for (int i=0;i<4;i++){35 xx=a.x;yy=a.y;sstep=a.step;kss=a.ks;36 xx+=dir[i][0];37 yy+=dir[i][1];38 sstep+=1;39 if (xx<1||xx>n||yy<1||yy>m)40 continue ;41 if (map[xx][yy])42 kss++;43 else kss=0;44 if (kss>k)45 continue ;46 if (visit[kss][xx][yy])47 continue ;48 if (xx==n&&yy==m)49 return sstep ;50 b.init (xx,yy,sstep,kss);51 q.push (b);52 visit[kss][xx][yy]=1;53 }54 }55 return -1;56 }57 58 int main (){59 int t;60 cin>>t;61 while (t--){62 cin>>n>>m>>k;63 if (n==m&&n==1){64 cout<<0<<"error"<<endl;65 continue ;66 }67 memset (visit,0,sizeof visit);68 for (int i=1;i<=n;i++)69 for (int j=1;j<=m;j++)70 cin>>map[i][j];71 int ans=bfs ();72 cout<<ans<<endl;73 }74 return 0;75 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。