啊哈演算法117頁的經典題目

紅緋魚發表於2014-11-27

深夜的水管工

include

//《啊哈演算法》P117 //寫程式碼的時候一定要非常小心,一個錯字元就可能浪費掉你幾個小時

using namespace std;

int n,m,flag; int a[51][51],b[51][51];

struct node //這種情況下比STL好用

{ int x; int y; }s[100]; int top=0;

void dfs(int x,int y,int front) { int i; if(x==n&&y==m+1)//中間如果加逗號是或的意思

{
    flag=1;
    for(i=1;i<=top;i++) //放在這裡是應為放底下會被全部彈出 

    cout<<"("<<s[i].x<<","<<s[i].y<<")-->";
    cout<<top<<"步"<<endl;
    return;
}
if(x<1||x>n||y<1||y>m)return;
if(b[x][y]==1)return;
b[x][y]=1;

top++;
s[top].x=x;
s[top].y=y;

if(a[x][y]==1)//x對應行,y對應列,,,不要搞反了 

{

    if(front==1)dfs(x,y+1,1);
    if(front==2)dfs(x+1,y,2);
    if(front==3)dfs(x,y-1,3);
    if(front==4)dfs(x-1,y,4);
}

if(a[x][y]==2)
{
    if(front==1)dfs(x-1,y,4),dfs(x+1,y,2);//逗號的應用 

    if(front==2)dfs(x,y-1,3),dfs(x,y+1,1);
    if(front==3)dfs(x-1,y,4),dfs(x+1,y,2);
    if(front==4)dfs(x,y-1,3),dfs(x,y+1,1);

}

b[x][y]=0;
top--;  //要記得彈出不然路徑裡就會多好多東西 

return;

}

int main() { int i,j; cin>>n>>m; for(i=1;i<=n;i++)for(j=1;j<=m;j++)cin>>a[i][j]; dfs(1,1,1); if(flag)cout<<"Yes"<

cin>>i;
return 0;

}

相關文章