最小步数(搜索第一题)

原题地址: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; }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值