首页 > 代码库 > HDU_2579_bfs
HDU_2579_bfs
http://acm.split.hdu.edu.cn/showproblem.php?pid=2579
简单bfs题,刚开始在纠结怎么存放vis,因为步数可能有几百步,这么多格子开数组的话也太多了,后来想到只要保存步数%k的状态就好了,bfs到达该点的步数肯定是最优的。
#include<iostream>#include<string>#include<cstring>#include<queue>using namespace std;string s[105];int r,c,k,dir[4][2] = {-1,0,0,-1,1,0,0,1},vis[105][105][15],flag;struct point{ int x,y,counts;}start;int main(){ int n; cin >> n; while(n--) { flag = 0; memset(vis,0,sizeof(vis)); cin >> r >> c >> k; for(int i = 0;i < r;i++) cin >> s[i]; for(int i = 0;i < r;i++) { for(int j = 0;j < c;j++) { if(s[i][j] == ‘Y‘) { start.x = i; start.y = j; goto there; } } } there: start.counts = 0; queue<point> q; q.push(start); vis[start.x][start.y][0] = 1; while(!q.empty()) { int x = q.front().x,y = q.front().y,counts = q.front().counts; q.pop(); if(s[x][y] == ‘G‘) { flag = 1; cout << counts << endl; break; } for(int i = 0;i < 4;i++) { int xx = x+dir[i][0],yy = y+dir[i][1],z = (counts+1)%k; if(xx < 0 || xx >= r || yy < 0 || yy >= c) continue; if(s[xx][yy] == ‘#‘ && z) continue; if(vis[xx][yy][z]) continue; point temp; temp.x = xx; temp.y = yy; temp.counts = counts+1; q.push(temp); vis[xx][yy][z] = 1; } } if(!flag) cout << "Please give me another chance!" << endl; } return 0;}
HDU_2579_bfs
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。