HDU 1072 Nightmare(搜尋)

來源:互聯網
上載者:User

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=1072

      這是一個很簡單的一個搜尋題目,資料量很小,基本上如果不陷入死迴圈就不會逾時,我犯了個小錯誤,rec在每次加過之後沒有恢複,一度錯我,半小時內沒發現

導致一直調試不通過!

      這個其實就是一道普通的BFS,用lock數組記錄到當前節點還剩下的時間,如果下次又到達這裡但是剩下的時間比上次來的時候少,那麼就不用來了,人家時間多的

都還沒到,你時間少的還過來,其次就是一些常識性減枝,完成一些更新,就ok了,看AC比率基本上都是1Y了

#include <iostream>#include <string.h>#include <stdio.h>#include <queue>#include <algorithm>using namespace std;int map[100][100];int n,m;int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}};struct point{    int have;    int time;    int i,j;};int lock[100][100];int find_ans(int i,int j){    queue<point>q;    int ans=99999;    point temp,rec;    temp.have=6,temp.time=0,temp.i=i,temp.j=j;    q.push(temp);    while(!q.empty())    {        temp=q.front();        rec=temp;       // printf("%d %d\n",rec.i,rec.j);        q.pop();        if(rec.time >=ans || rec.have<=0)        continue;        if(map[rec.i][rec.j]==3)        {            ans=rec.time;            continue;        }        if(map[rec.i][rec.j]==4)        {            temp.have=6;            rec.have=6;        }        for(i=0;i<4;i++)        {            rec=temp;            if(map[temp.i+dir[i][0]][temp.j+dir[i][1]]!=0)            {                //printf("temp: %d %d\n",temp.i+dir[i][0],temp.j+dir[i][1]);                rec.i+=dir[i][0],rec.j+=dir[i][1];                rec.have--;                rec.time++;                //printf("I:%d %d %d\n",i,rec.i,rec.j);                if(lock[temp.i+dir[i][0]][temp.j+dir[i][1]] < rec.have)                {                  //  printf("h:%d\n",rec.have);                    q.push(rec);                    lock[temp.i+dir[i][0]][temp.j+dir[i][1]]=rec.have;                }            }        }    }    if(ans==99999)    printf("%d\n",-1);    else    printf("%d\n",ans);    return 0;}int main(){    int t,i,j,k,a,b;    scanf("%d",&t);    while(t--)    {        memset(map,0,sizeof(map));        for(i=0;i<100;i++)        for(j=0;j<100;j++)        lock[i][j]=0;        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        {            scanf("%d",&map[i][j]);            if(map[i][j]==2)            a=i,b=j;        }        find_ans(a,b);    }    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.