hdu 1175 連連看 BFS

來源:互聯網
上載者:User

題目  http://acm.hdu.edu.cn/showproblem.php?pid=1175

這是一個簡單的搜尋問題  BFS   剛開始覺得是簡單但是還是不會做哦 ,很糾結。。。但終於看別人報告出來的。。。

當時看別人報告的時候一直糾結一個問題  就是沒想明白到底為什麼。。。呵呵。。。

 if(s.di==-1){s.di=i;s.num=0;}            else if(s.di!=i){s.num++;s.di=i;}   ///記錄上一次的方向。。。

為什麼這裡s.di!=i 就是轉彎呢???呵呵    這個是從上右下左來的,假如你第一次走左邊則會記錄 i  第二次如果又走 左邊還是 i 所以肯定沒有轉彎啊。。。

要注意一下dre[4][2]的順序哦  是上右下左哦。。。

下面ac代碼

#include<iostream>#include<cstdio>#include<queue>using namespace std;struct node{int x,y;int di,num;}st;int n,m,ex,ey,sx,sy;int map[1001][1001],mark[1001][1001];int dre[4][2]={0,1,1,0,0,-1,-1,0};bool judge(int x,int y){    if(x>0&&x<=n&&y>0&&y<=m&&(!map[x][y]||x==ex&&y==ey))///判斷是否在範圍裡    {        return true;    }    else return false;}bool bfs(){    queue<node> Q;    Q.push(st);    node s,p;    int i;    while(!Q.empty())    {        p=Q.front();        Q.pop();        if(p.x==ex&&p.y==ey)        {            return true;        }        for(i=0;i<4;i++)  ///上右下左        {            s=p;            s.x+=dre[i][0];            s.y+=dre[i][1];            if(s.di==-1){s.di=i;s.num=0;}            else if(s.di!=i){s.num++;s.di=i;}   ///記錄上一次的方向。。。            if(s.num>2) continue;               if(judge(s.x,s.y))   ///判斷是否在這個裡面哦            {                if(mark[s.x][s.y]>s.num)  ///如果小於就說明你的轉彎次數更少。。                {                    mark[s.x][s.y]=s.num;                    Q.push(s);                }            }        }    }  return false;}int main(){    int i,j,k;    while(scanf("%d %d",&n,&m)!=EOF,n+m)      {        for(i=1;i<=n;i++)         for(j=1;j<=m;j++)          scanf("%d",&map[i][j]);        scanf("%d",&k);        while(k--)        {            scanf("%d %d %d %d",&sx,&sy,&ex,&ey);            ///判斷是否合理。。。。            if((sx==ex&&sy==ey)||!map[sx][sy]||map[sx][sy]!=map[ex][ey])            {                printf("NO\n");                continue;            }            st.x=sx;            st.y=sy;            st.di=-1;            st.num=0;             ///標記轉彎次數            for(i=1;i<=n;i++)             for(j=1;j<=m;j++)              mark[i][j]=1000000;            if(bfs()){printf("YES\n");}            else printf("NO\n");        }    }    return 0;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.