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) 就少了一次++ -- 也简化代码了

原创粉丝点击