poj 3009
来源:互联网 发布:防盗网络应用 编辑:程序博客网 时间:2024/06/06 15:47
之前写了几次,都差点
今天总算a了
但就是忘了判断是否能滑行,加上就a了
代码如下
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int w,h,sx,sy,gx,gy,mi;int xx[4]={1,0,-1,0};int yy[4]={0,1,0,-1};int a[25][25];int cc=0;void dfs(int sx,int sy,int cnt){int sum=0;for(int i=0;i<4;i++){int x=sx+xx[i],y=sy+yy[i];if(a[x][y]==1||x<0||x>=h||y<0||y>=w) sum++;}if(sum==4) return ;for(int i=0;i<4;i++){int x=sx+xx[i],y=sy+yy[i];if(a[x][y]==1||x<0||x>=h||y<0||y>=w) continue;int p=0;if(i==0){for(int j=sx;j<h;j++) {if(a[j][sy]==1||a[j][sy]==3) p++;}}if(i==1){for(int j=sy;j<w;j++) {if(a[sx][j]==1||a[sx][j]==3) p++;}}if(i==2){for(int j=sx;j>=0;j--) {if(a[j][sy]==1||a[j][sy]==3) p++;}}if(i==3){for(int j=sy;j>=0;j--) {if(a[sx][j]==1||a[sx][j]==3) p++;}}if(p==0) continue;cnt++;if(cnt>=11) return ;int flag=0;while(a[x][y]!=1){if(x==gx&&y==gy) { mi=min(mi,cnt); flag=1; break;}x+=xx[i]; y+=yy[i];}if(flag==1) {cnt--; continue;}a[x][y]=0;x-=xx[i]; y-=yy[i];dfs(x,y,cnt);a[x+xx[i]][y+yy[i]]=1; cnt--;}return ;}int main(){while(~scanf("%d %d",&w,&h)){if(w==0&&h==0) break;for(int i=0;i<h;i++)for(int j=0;j<w;j++){scanf("%d",&a[i][j]);if(a[i][j]==2){sx=i; sy=j;}if(a[i][j]==3){gx=i; gy=j;}}int cnt=0;mi=11;dfs(sx,sy,cnt);if(mi==11) printf("-1\n");else printf("%d\n",mi);}}
感觉自己处理路径过程中比较麻烦了
看来别人写的
是这样写的
一直跑直到a[i][j]!=0
然后再判断是否出界,出界就跳过
不出界就看是1还是3 比我提前判断要简单多了
而且直接dfs(step+1) 就少了一次++ -- 也简化代码了
阅读全文
0 0
- POJ 3009
- poj 3009
- POJ 3009
- POJ 3009
- POJ-3009
- POJ 3009
- POJ 3009
- poj-3009
- poj--3009
- poj 3009
- POJ 3009
- poj-3009
- poj 3009
- POJ 3009
- poj 3009
- 【POJ】3009
- POJ 3009
- poj 3009
- Tomcat 服务器Session管理深入剖析-附带源代码分析
- 逗号运算符花絮
- DEM 接边软件(不同源的DEM平缓过渡)
- Dubbo 管控台如何链接zookeeper集群
- 回溯题目/排列、组合、子集问题
- poj 3009
- 【HDU 1045】Fire Net(DFS,check函数)
- 写第一篇博文
- vm-c
- DS:串的简单匹配
- 关于MySql的SSL-Connection
- 牛客《剑指Offer》 -- 数值的整数次方
- (三) u-boot 启动分析_第一阶段
- Stm32 烧程序出现 Error:Flash Download Failed-"Cortex-M3"对话框解决方案