poj3009 Curling 2.0(dfs)
阿新 • • 發佈:2018-11-09
思路來源
我自己想的,只是想總結一下QAQ
題意
相當於,扔一個保齡球,
碰到牆就能砸毀牆,並停在牆前一格
碰到終點的洞,就會落下去
問起點到終點,最少需要幾格
心得
是個簡單dfs,然而debug了好久。
自己得做一遍大一的題,好好鞏固一下知識QAQ
嗯,大一學的時候,就是不大懂那個改回去的操作,
if(maze[xx][yy]==1)
{
maze[xx][yy]=0;
dfs(xx-dx[i],yy-dy[i],step+1);
maze[xx][yy]=1;
}
就像拆盒子一樣,先給當前盒子標記,再去拆盒子的子盒子,
拆裡面子盒子的子盒子(遞迴)
如果有解,就帶著標記,
否則沒解,返回時,把該盒子的標記改回來。
不得不說,這題樣例很良心,
讓我找到了自己所有和樣例考慮的不一樣的地方。
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const int INF=0x3f3f3f3f; const int maxn=1e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-7; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<int,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int r,c,sx,sy,ex,ey,ans; int dx[]={1,0,-1,0},dy[]={0,1,0,-1}; int maze[25][25]; bool check(int xx,int yy) { if(xx>=0&&xx<r&&yy>=0&&yy<c)return 1; return 0; } void init() { ans=INF; mem(maze,-1); } void dfs(int x,int y,int step) { if(step>10)return; else if(x==ex&&y==ey) { ans=min(ans,step); return; } for(int i=0;i<4;++i) { int xx=x+dx[i],yy=y+dy[i]; if(check(xx,yy)&&maze[xx][yy]==1)continue;//相鄰牆 不行 while(check(xx,yy)&&(maze[xx][yy]==0||maze[xx][yy]==2))xx+=dx[i],yy+=dy[i]; if(!check(xx,yy))continue; if(maze[xx][yy]==1) { maze[xx][yy]=0; dfs(xx-dx[i],yy-dy[i],step+1); maze[xx][yy]=1; } else if(maze[xx][yy]==3) { dfs(xx,yy,step+1); } } } int main() { while(~scanf("%d%d",&c,&r)&&c+r) { init(); rep(i,0,r-1) { rep(j,0,c-1) { sci(maze[i][j]); if(maze[i][j]==2)sx=i,sy=j; else if(maze[i][j]==3)ex=i,ey=j; } } dfs(sx,sy,0); if(ans==INF)ans=-1; printf("%d\n",ans); } return 0; }