nyoj-58-最小步数
2013-07-19 09:38
232 查看
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #define L 9 using namespace std; bool 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}}; int num[9][9],dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},dis[81],temp[9][9];//num数组存放到某一点的最小步数,dis为队列,temp标记是否访问过 int bfs(int x1,int y1,int x2,int y2); int main() { int n,a,b,c,d; scanf("%d",&n); while(n--) { scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",bfs(a,b,c,d)); } return 0; } int bfs(int x1,int y1,int x2,int y2) { memset(num,0,sizeof(num)); memset(temp,0,sizeof(temp)); int l=0,r=0,t; t=x1*L+y1; dis[r++]=t; temp[x1][y1]=1; num[x1][y1]=0; while(l<r) { t=dis[l++]; int x,y,bx,by; x=t/L;y=t%L; for(int i=0;i<4;i++) { bx=x+dx[i];by=y+dy[i]; if(temp[bx][by]==0&&bx>=0&&bx<L&&by>=0&&by<L&&map[bx][by]==0) { dis[r++]=bx*L+by; num[bx][by]=num[x][y]+1; temp[bx][by]=1; } } } return num[x2][y2]; }
此题用广搜 打出步数表 然后输出 其实可以在找到这点后就可以跳出了 没必要全循环完的我的第一次广搜代码 见谅啊 各位
相关文章推荐
- NYOJ 题目58最小步数
- NYOJ 58 最小步数(BFS && DFS)
- nyoj 58 最小步数(入门bfs)
- NYOJ 58 最小步数
- nyoj 58 最小步数(回溯算法应用)
- NYOJ 58 最小步数 BFS queue 实现
- nyoj 58 最小步数(bfs)
- NYOJ 58 最小步数(迷宫搜索)
- NYOJ-58 最小步数
- 【深度搜索】NYOJ58最小步数
- NYOJ-58 最小步数 AC
- nyoj27水池数目VSnyoj58最小步数(DFS)
- NYOJ - 58 最小步数
- nyoj 58 最小步数
- nyoj 58 最小步数
- NYOJ 58 最小步数(bfs)
- NYOJ 58 最小步数【bfs】
- NYOJ 题目58 最小步数
- nyoj58最小步数——BFS
- NYOJ58——最小步数,简单的BFS应用