最小步数(搜索第一题)

原题地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=58

表示鸭梨好大!队友AC好久以后,我终于才开始看搜索,伤不起啊!!必须的加油了,要不下次踢人就会有我一个了,呜呜呜!!!抓狂

代码如下:(赶时间,草草完事)

#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct sousuo { int x,y,step; }e,r; int m[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 n[9][9]={0},shangxia[4]={0,0,1,-1},zuoyou[4]={1,-1,0,0}; queue <sousuo> Q; int search(int a,int b,int c,int d) { int i,j; sousuo e={a,b,0}; Q.push(e); while(!Q.empty()) { e=Q.front(); n[e.x][e.y]=1; if( e.x==c && e.y==d ) break; for(int k=0;k<4;k++) { i=e.x+zuoyou[k]; j=e.y+shangxia[k]; if(i>=1&&i<9&&j>=1&&j<9&&!n[i][j]&&!m[i][j]) { sousuo r={i,j,e.step+1}; Q.push(r); n[r.x][r.y]=1; } } Q.pop(); } if(Q.empty()) return -1; while(!Q.empty()) Q.pop(); return e.step; } int main() { int a,b,x1,x2,y1,y2; scanf("%d",&a); while(a--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); memset(n,0,sizeof(n)); printf("%d\n",search(x1,y1,x2,y2)); } return 0; }


好久都没爆发了,表示自己现在已经没有的着火点已经变得很高了,想爆发一次,这得需要多大的温度啊???

也许,改天那个妹妹能够给我降一降着火点……嘿嘿大笑

大牛的递归好强大!!以后要研究一下

#include<iostream> using namespace std; int arr[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 a,b,c,d,m; void dfs(int i,int j,int s) { if(arr[i][j]==1) return ; if(i==c&&j==d) { m=min(s,m); return ; } s=s+1; arr[i][j]=1; dfs(i+1,j,s); dfs(i,j+1,s); dfs(i-1,j,s); dfs(i,j-1,s); arr[i][j]=0; } int main() { int t; cin>>t; while(t--) { m=20000000; cin>>a>>b>>c>>d; dfs(a,b,0); cout<<m<<endl; } return 0; }


还有xiaod的代码,他感觉他自己的代码很犀利,我一定要膜拜一下!!

#include <stdio.h> #include <string.h> #include <deque> using namespace std; typedef struct { int x,y; int step; }Ac; Ac start,end ; 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 }; bool visit[9][9]; bool can_insert(int x,int y) { return map[x][y]==0 && visit[x][y]==0; } bool is_arrive(int x,int y) { visit[x][y]=1; return x==end.x && y==end.y; } deque <Ac> A; int my_push(int x,int y,int step) { Ac Rush; if(can_insert(x,y)) { if(is_arrive(x,y)) { printf("%d\n",step); return 1; } Rush.x = x, Rush.y = y ; Rush.step = step; A.push_back(Rush); } return 0; } void BFS() { if(is_arrive(start.x,start.y)) { printf("0\n"); return; } while(!A.empty()) { int step = A.front().step + 1; int now_x = A.front().x , now_y = A.front().y ; if(my_push(now_x,now_y+1,step)) return; if(my_push(now_x,now_y-1,step)) return; if(my_push(now_x-1,now_y,step)) return; if(my_push(now_x+1,now_y,step)) return; A.pop_front(); } } int main() { int z; scanf("%d",&z); while(z--) { memset(visit,0,sizeof(visit)); scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y); visit[start.x][start.y] = 1; start.step = 0; A.push_back(start); BFS(); A.clear(); } return 0; }


计算走出迷宫最小步数通常有深度优先搜索(DFS)和广度优先搜索(BFS)两种方法: ### 深度优先搜索(DFS) 深度优先搜索是一种递归的搜索方法,它沿着一条路径尽可能深地探索,直到无法继续,然后回溯到上一个节点,继续探索其他路径。以下是使用DFS计算走出迷宫最小步数的示例代码: ```cpp #include<bits/stdc++.h> using namespace std; int n,m; char a[50][50]; int d[50][50]; int fx[5]={0,0,1,0,-1}; int fy[5]={0,1,0,-1,0}; void dfs(int x,int y,int dep){ d[x][y]=dep; int tx,ty; for(int i=1;i<=4;i++){ tx=x+fx[i]; ty=y+fy[i]; if(a[tx][ty]=='.'&&dep+1<d[tx][ty]) { dfs(tx,ty,dep+1); } } } int main(){ int i,j; cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; d[i][j]=INT_MAX; } } dfs(1,1,1); cout<<d[n][m]; return 0; } ``` 在上述代码中,`dfs`函数用于递归地探索迷宫,`d`数组用于记录到达每个格子的最少步数。 ### 广度优先搜索(BFS) 广度优先搜索是一种逐层扩展的搜索方法,它从起点开始,逐层地探索相邻的节点,直到找到终点。由于BFS是逐层扩展的,所以第一次到达终点时的步数就是最小步数。以下是使用BFS计算走出迷宫最小步数的示例代码: ```cpp #include<bits/stdc++.h> using namespace std; char a[51][51]; int r,c; int fx[4]={0,0,1,-1}; int fy[4]={1,-1,0,0}; int tx,ty; struct Node{ int x,y,step; }; int bfs(int x,int y){ a[x][y]='#'; queue<Node> q; q.push({x,y,1}); while(!q.empty()){ Node Current=q.front(); q.pop(); if(Current.x==r&&Current.y==c){ return Current.step; } for(int i=0;i<4;++i){ tx=Current.x+fx[i]; ty=Current.y+fy[i]; if(a[tx][ty]=='.'){ a[tx][ty]='#'; q.push({tx,ty,Current.step+1}); } } } return -1; } int main(){ cin>>r>>c; for(int i=1;i<=r;i++){ for(int j=1;j<=c;j++){ cin>>a[i][j]; } } cout<<bfs(1,1); return 0; } ``` 在上述代码中,`bfs`函数使用队列来实现广度优先搜索,`Node`结构体用于存储当前位置和步数。 ### 复杂度分析 - **时间复杂度**:DFS和BFS的时间复杂度均为 $O(R \times C)$,其中 $R$ 和 $C$ 分别是迷宫的行数和列数。 - **空间复杂度**:DFS的空间复杂度为 $O(R \times C)$,主要用于递归栈的空间;BFS的空间复杂度也为 $O(R \times C)$,主要用于队列的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值