6-5 巡逻机器人 uva1600
Posted bxd123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6-5 巡逻机器人 uva1600相关的知识,希望对你有一定的参考价值。
一开始按照标准bfs来写 标记为二维数组
后来按照三维数组写过了 ps大部分bfs都不会是二维数组搞定!!!
其中有一个bug弄了半个小时。。。
一开始我是先判断!vis【x】【y】【v.c】 再判断方块是否为1 是的话v.c++;否的话归零
但是 这并不科学 到另外一个方块的时候 如果数组下标内容和结构体有关的话 应该先改变状态再判断 就如同肯定是先在u的基础上改变dx dy 再判断v.x v.y 一个道理 不然会超时!因为头不对尾
#include<bits/stdc++.h> using namespace std; int m1[25][25];int n,m,chance; bool vis[25][25][25]; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; struct node { int x,y,d,c; node(int x=0,int y=0,int d=0,int c=0):x(x),y(y),d(d),c(c){} }; bool inmap(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m)return true; return false; } void bfs() { memset(vis,false,sizeof(vis)); node u(1,1,0,0); queue<node>q; q.push(u); vis[1][1][0]=true; while(!q.empty()) { u=q.front();q.pop(); if(u.x==n&&u.y==m){printf("%d ",u.d);return;} for(int i=0;i<4;i++) { node v(u.x+dx[i],u.y+dy[i],u.d+1,u.c); if(m1[v.x][v.y]) v.c++; else v.c=0; if(v.c<=chance&&!vis[v.x][v.y][v.c]&&inmap(v.x,v.y)) { vis[v.x][v.y][v.c]=true; q.push(v); } } } printf("-1 "); return ; } int main() { int cas;cin>>cas; while(cas--) { scanf("%d %d %d",&n,&m,&chance); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&m1[i][j]); bfs(); } }
以上是关于6-5 巡逻机器人 uva1600的主要内容,如果未能解决你的问题,请参考以下文章
习题6_5 巡逻机器人(Patrol Robot, ACM/ICPC Hanoi 2006, UVa1600)