首页 > 代码库 > NYOJ 58 最少步数 【BFS】
NYOJ 58 最少步数 【BFS】
题意:不解释。
策略:如题;
这道题可以用深搜也可以用广搜,我以前写的是用的深搜,最近在学广搜,就拿这道题来练练手。
代码:
#include<stdio.h> #include<string.h> #include<queue> using std::queue; bool vis[20][20]; const int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};//方向 int map[9][9] = { 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; struct Node{ int pos[2];//pos[0] = x, pos[1] = y int step; }; Node st, en; bool match(Node a, Node b) //判断是不是到达终点 { return (a.pos[0] == b.pos[0]&&a.pos[1] == b.pos[1]); } int bfs() { queue<Node> q; int i, j; memset(vis, 0, sizeof(vis)); q.push(st); vis[st.pos[0]][st.pos[1]] = 1; int ans = 0x3f3f3f3f; //初始化 while(!q.empty()){ Node u = q.front(); if(match(u, en)){ //wa了一次是因为没有判断终点是不是起点 ans = u.step; break; } for(i = 0; i < 4; i ++){ Node v; v.pos[0] = u.pos[0]+dir[i][0]; v.pos[1] = u.pos[1]+dir[i][1]; v.step = u.step+1; if(match(v, en)){ if(v.step < ans) ans = v.step; } else if(!vis[v.pos[0]][v.pos[1]]&&!map[v.pos[0]][v.pos[1]]){ q.push(v); vis[v.pos[0]][v.pos[1]] = 1; } } q.pop(); } return ans; } int main() { int t; scanf("%d", &t); while(t --){ scanf("%d%d%d%d", &st.pos[0], &st.pos[1], &en.pos[0], &en.pos[1]); st.step = 0; printf("%d\n", bfs()); } return 0; }
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=58
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。