1. 程式人生 > >poj3009 Curling 2.0(dfs)

poj3009 Curling 2.0(dfs)

思路來源

我自己想的,只是想總結一下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;
}