青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

我叫張小黑
張小黑的掙扎生活
posts - 66,  comments - 109,  trackbacks - 0
大家有好的代碼請發(fā)我郵箱:zhangjia888334@sohu.com 
今天就作了廣搜三道題,做個小節(jié)。
首先要糾正腦子里的一個錯誤觀念,以前的我的廣搜模式就是開個隊列,走過的點(diǎn)不能走,隊列的類型我還必定是用結(jié)構(gòu)體來做
結(jié)構(gòu)體里放個x,y,n,x-->橫坐標(biāo),y-->縱坐標(biāo),n-->步數(shù)
再來幾個標(biāo)準(zhǔn)的二維數(shù)組,map[Maxh][Maxw]-->描述地圖,visit[Maxh][Maxw]--〉描述走沒走過.
這都是我以前默認(rèn)的廣搜類型,這三道題我感覺每個都有每個得特色,都有各自特殊情況
首先是第一道:
A:Tom and Jerry
這道題就不需要開隊列,他每次走都只有一個方向,每次的行走只有一個目標(biāo),所以只要有個while(1)的循環(huán)
在循環(huán)里加上判斷可以break的情況
這道題開始我犯了一個錯誤,我認(rèn)為他們再次同時到達(dá)以前他們同時到達(dá)的位置就失敗了
但是我沒考慮方向,應(yīng)該是他們同時到達(dá)以前他們到達(dá)的位置,并且方向還和以前一樣,這樣才是失敗的
但是及便加上這個也是tle
比如爭對以下這種數(shù)據(jù):(是死都出不來的)
*...*...*C
......*.**
...*...*..
..........
...*......
*.....*...
...*......
..M......*
...*.*....
.*.*......
所以加上了另外一個很惡心的結(jié)束條件,以下是我的代碼,這道題有個地方的處理不好,內(nèi)存很大
#include<iostream>
#define MaxN 
10
#define Max 
400000
int map[MaxN][MaxN];//1表示能走,0表示不能走
int hash[Max];
int dx[]={-1,0,1,0},dy[]={0,1,0,-1};
int time,mx,my,cx,cy;//當(dāng)前位置
int mdir,cdir;//方向
void solve()
{
    
int k;
    
int tmp_cx,tmp_cy,tmp_mx,tmp_my;
    
while(1){
        
if(mx==cx&&my==cy){
            printf(
"%d\n",time);
            return;
        }
        k
=cy+cx*10+my*100+mx*1000+cdir*10000+mdir*100000;
        
if(time>1000||hash[k]){
            printf(
"-1\n");
            return;
        }
        tmp_cx
=cx+dx[cdir];
        tmp_cy
=cy+dy[cdir];
        tmp_mx
=mx+dx[mdir];
        tmp_my
=my+dy[mdir];
        
if(tmp_cx<0||tmp_cx>=MaxN||tmp_cy<0||tmp_cy>=MaxN)
            cdir
=(cdir+1)%4;
        
else if(map[tmp_cx][tmp_cy]){
            cx
=tmp_cx;
            cy
=tmp_cy;
        }
        
else cdir=(cdir+1)%4;
        
if(tmp_mx<0||tmp_mx>=MaxN||tmp_my<0||tmp_my>=MaxN)
            mdir
=(mdir+1)%4;
        
else if(map[tmp_mx][tmp_my]){
            mx
=tmp_mx;
            my
=tmp_my;
        }
        
else mdir=(mdir+1)%4;
        
time++;
    }
}
int main()
{
    
int T,i,j;
    char c[
20];
    
while(scanf("%d",&T)!=EOF&&T){
        
while(T--){
            cdir
=mdir=time=0;
            memset(map,
0,sizeof(map));
            memset(hash,
0,sizeof(hash));
            
for(i=0;i<MaxN;i++){
                scanf(
"%s",c);
                
for(j=0;j<MaxN;j++){
                    
if(c[j]!='*')map[i][j]=1;
                    if(c[j]=='C'){cx=i;cy=j;}
                    if(c[j]=='M'){mx=i;my=j;}
                }
            }
            solve();
        }
    }
    return 
0;
}

B Escape
這道題我過的還算順利,這道題是需要開queue的,因為它首先是需要算最少數(shù)的題,然后,當(dāng)我們重新以相同的方向走到以前走過的點(diǎn)時時不需要入隊的,所以他的visit是三維的,runtime error了一次,主要是我的queue 開的太小了,我開始只開了Max*Max,但是一個點(diǎn)可能要入隊幾次,因為有不同的方向,所以只開這么點(diǎn)是不夠的,以下是我的代碼:
//一碰見能轉(zhuǎn)彎的一定要轉(zhuǎn)
//隨便向左向右
//但是不能往后走,或是回轉(zhuǎn)
//到達(dá)房間邊緣就算是出來了,算最短步數(shù)
#include
<iostream>
#define Max 
80
struct node{
    
int x,y,time,dir;
} queue[
100000];
int map[Max][Max];//1表示能走0表示不能
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int visit[Max][Max][4];//x,y,dir
int h,w;
int sx,sy;//起始位置
int head,tail;
void solve()
{
    
int i,hx,hy,ht,hd;
    
int px,py,d;
    
int m,n;
    head
=tail=0;
    
for(i=0;i<4;i++){
        queue[tail].x
=sx;
        queue[tail].y
=sy;
        queue[tail].dir
=i;
        queue[tail
++].time=0;
        visit[sx][sy][i]
=1;
    }
    
while(head<tail){
        m
=n=0;
        hx
=queue[head].x;
        hy
=queue[head].y;
        ht
=queue[head].time;
        hd
=queue[head++].dir;
        
if(hx==0||hx==h-1||hy==0||hy==w-1){//到達(dá)房間邊界
            printf(
"%d\n",ht);
            return;
        }
        d
=(hd+1)%4;//向右走
        px
=hx+dx[d];py=hy+dy[d];//px,py不會越界,因為hx,hy不在邊界上,再走一步也不會越界
        
if(map[px][py]){
            m
=1;
            
if(!visit[px][py][d]){
                queue[tail].x
=px;
                queue[tail].y
=py;
                queue[tail].time
=ht+1;
                queue[tail
++].dir=d;
                visit[px][py][d]
=1;}
        }
        d
=(hd+3)%4;
        px
=hx+dx[d];py=hy+dy[d];//同樣不會越界
        
if(map[px][py]){
            n
=1;
            
if(!visit[px][py][d]){
                queue[tail].x
=px;
                queue[tail].y
=py;
                queue[tail].time
=ht+1;
                queue[tail
++].dir=d;
                visit[px][py][d]
=1;}
        }
        px
=hx+dx[hd];py=hy+dy[hd];
        
if(!m&&!n&&map[px][py]&&!visit[px][py][hd]){
            queue[tail].x
=px;
            queue[tail].y
=py;
            queue[tail].time
=ht+1;
            queue[tail
++].dir=hd;
            visit[px][py][hd]
=1;
        }
    }
    printf(
"-1\n");
}
int main()
{
    
int T,i,j;
    char c[
100];
    scanf(
"%d",&T);
    
while(T--){
        memset(map,
0,sizeof(map));
        memset(visit,
0,sizeof(visit));
        memset(queue,
0,sizeof(queue));
        scanf(
"%d%d",&h,&w);
        
for(i=0;i<h;i++){
            scanf(
"%s",c);
            
for(j=0;j<w;j++){
                
if(c[j]!='#')map[i][j]=1;
                if(c[j]=='@'){sx=i;sy=j;}
            }
        }
        solve();
    }
    return 
0;
}


C Push!
這道題我其實做了兩層搜索,我代碼有點(diǎn)冗長,看別人都很短,不知道他們是怎么實現(xiàn)的
首先解釋下我的
int visit[Max][Max][Max][Max];
//cx,cy,mx,my
在每次定位cx,cy(箱子坐標(biāo))好時,我們都要設(shè)置visit以下,主要是把箱子附近的人可到達(dá)位置定為1,這樣下次再遍歷到就不用加入隊列了
這道題我還蠻像寫清楚我是怎么想的,但還真有點(diǎn)混亂,尤其是這一段
for(i=0;i<4;i++){
   pcx=hcx+dx[i]; pcy=hcy+dy[i];
   pmx=hcx+dx[(i+2)%4]; pmy=hcy+dy[(i+2)%4];
   if(pmx<0||pmx>=h||pcx<0||pcy>=w)continue;
   if(pcx<0||pcx>=h||pcy<0||pcy>=w)continue;
   if(map[pcx][pcy]==1)continue;
   if(visit[pcx][pcy][hcx][hcy])continue;
   if(!visit[hcx][hcy][pmx][pmy])continue;
   push(hcx,hcy,pcx,pcy,hnum+1);
   set_visit(hcx,hcy,pcx,pcy);
  }
這兩個visit[][][]的判斷是兩層visit的判斷,要想清楚
這道題基本上寫完后沒什么錯,都是些什么x寫成y,p寫成q的錯誤,這還多虧了pc,我邊聊天,邊寫的
以下是我的代碼:
#include<iostream>
#define Max 
7
struct node{
    
int cx,cy,mx,my,num;
}queue[
1000];
int visit[Max][Max][Max][Max];
//cx,cy,mx,my
int map[Max][Max];
//對于人來說邊界不能走,不能走,也不能,其余的可以
//對于箱子來說表示不能走邊界不能走,其余的都能走
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int man_x,man_y,cargo_x,cargo_y;
int w,h;
int head,tail;
void push(
int x1,int y1,int x2,int y2,int n)
{
    queue[tail].mx
=x1;
    queue[tail].my
=y1;
    queue[tail].cx
=x2;
    queue[tail].cy
=y2;
    queue[tail
++].num=n;
}
void set_visit(
int x1,int y1,int x2,int y2)
{
//men:(x1,y1),cargo:(x2,y2)
    
int qnx[1000]={0},qny[1000]={0};
    
int p,q,px,qy,i;
    
int fis=0,end=0;
    qnx[
end]=x1; qny[end++]=y1;
    visit[x2][y2][x1][y1]
=1;
    
while(fis<end){
        p
=qnx[fis]; q=qny[fis++];
        
for(i=0;i<4;i++){
            px
=p+dx[i]; qy=q+dy[i];
            
if(px<0||px>=h||qy<0||qy>=w)continue;
            
if(map[px][qy]==1)continue;
            
if(px==x2&&qy==y2)continue;//注意
            
if(visit[x2][y2][px][qy])continue;
            qnx[
end]=px; qny[end++]=qy;
            visit[x2][y2][px][qy]
=1;
        }
    }
}
void solve()
{
    
int i;
    
int hmx,hmy,hcx,hcy,hnum;
    
int pcx,pcy,pmx,pmy;
    push(man_x,man_y,cargo_x,cargo_y,
0);
    set_visit(man_x,man_y,cargo_x,cargo_y);
    
while(head<tail){
        hmx
=queue[head].mx;
        hmy
=queue[head].my;
        hcx
=queue[head].cx;
        hcy
=queue[head].cy;
        hnum
=queue[head++].num;
        
if(map[hcx][hcy]==3){
            printf(
"%d\n",hnum);
            return;
        }
        
for(i=0;i<4;i++){
            pcx
=hcx+dx[i]; pcy=hcy+dy[i];
            pmx
=hcx+dx[(i+2)%4]; pmy=hcy+dy[(i+2)%4];
            
if(pmx<0||pmx>=h||pcx<0||pcy>=w)continue;
            
if(pcx<0||pcx>=h||pcy<0||pcy>=w)continue;
            
if(map[pcx][pcy]==1)continue;
            
if(visit[pcx][pcy][hcx][hcy])continue;
            
if(!visit[hcx][hcy][pmx][pmy])continue;
            push(hcx,hcy,pcx,pcy,hnum
+1);
            set_visit(hcx,hcy,pcx,pcy);
        }
    }
    printf(
"-1\n");
}
int main()
{
    
int i,j;
    
while(scanf("%d%d",&w,&h)!=EOF&&w&&h){
        head
=tail=0;
        memset(map,
0,sizeof(map));
        memset(queue,
0,sizeof(queue));
        memset(visit,
0,sizeof(visit));
        
for(i=0;i<h;i++)
            
for(j=0;j<w;j++){
                scanf(
"%d",&map[i][j]);
                
if(map[i][j]==2){cargo_x=i;cargo_y=j;}
                
else if(map[i][j]==4){man_x=i;man_y=j;}
            }
        solve();
    }
    return 
0;
}
ps: 我想到了個push我犯了個錯誤,就是set_visit的那個搜索,因為這個搜索其實是針對人所能到達(dá)位置的搜索
而人有兩個地方是到不了的,一個是箱子的地方,一個是障礙物的地方
而箱子這個就要注意了,因為箱子位置是動態(tài)的,所以不能通過map[][]是否等于2來判斷。
posted on 2008-04-10 00:57 zoyi 閱讀(363) 評論(0)  編輯 收藏 引用 所屬分類: acm搜索
歡迎光臨 我的白菜菜園

<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

常用鏈接

留言簿(8)

隨筆分類

隨筆檔案

文章檔案

相冊

acmer

online judge

隊友

  • mango_young
  • 麥兜同學(xué)。。不要玩游戲了
  • samehere
  • 甜菜姐姐。。。

技術(shù)

朋友

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美精品 日韩| 日韩视频免费大全中文字幕| 激情欧美一区二区三区| 国产精自产拍久久久久久| 国产精品高潮呻吟视频| 国产精品美女久久福利网站| 国产欧美日韩视频一区二区| 国产一区二区三区成人欧美日韩在线观看 | 欧美亚洲第一区| 国产精品一区二区视频| 激情亚洲网站| 99在线精品视频| 性久久久久久久久久久久| 久久国产精品久久久久久久久久| 久久综合导航| 亚洲欧洲日本一区二区三区| 亚洲欧洲精品一区二区三区| 亚洲一区二区三区精品在线观看| 久久精品视频导航| 欧美日韩国产一区| 韩曰欧美视频免费观看| 99亚洲视频| 蜜臀av国产精品久久久久| 亚洲美女色禁图| 久久久91精品国产一区二区三区| 欧美日韩视频专区在线播放| 好吊成人免视频| 亚洲欧美日韩国产一区| 欧美激情亚洲视频| 欧美一区二区三区四区高清| 欧美日韩国产三区| 亚洲高清在线观看一区| 亚洲欧美激情视频在线观看一区二区三区 | 99在线视频精品| 久久婷婷人人澡人人喊人人爽| 亚洲狼人综合| 久久在线免费观看| 亚洲午夜女主播在线直播| 久久高清福利视频| 欧美午夜美女看片| 亚洲欧洲在线一区| 老司机午夜精品| 欧美专区日韩专区| 国产精品一区在线播放| 亚洲在线视频| 一区二区免费在线播放| 欧美国产日韩视频| 亚洲高清av| 久久亚洲精品一区| 欧美在线二区| 国模精品一区二区三区色天香| 亚洲淫片在线视频| 中文网丁香综合网| 国产精品多人| 欧美一区二区| 欧美一区二区视频97| 国产精品一区在线观看| 午夜精品久久久久久久99热浪潮 | 亚洲私拍自拍| aa级大片欧美三级| 国产精品国产三级国产普通话三级| 亚洲精品偷拍| 亚洲精品久久嫩草网站秘色 | 欧美日韩精品综合| 亚洲午夜久久久久久尤物| 一区二区三区欧美激情| 国产精品久久久久天堂| 欧美一区二区在线| 欧美在线999| 亚洲国产精品一区制服丝袜| 亚洲国产精品尤物yw在线观看 | 久久成人免费视频| 亚洲福利久久| 亚洲毛片视频| 国产麻豆成人精品| 久久一本综合频道| 欧美aa在线视频| 亚洲三级视频在线观看| 日韩午夜一区| 国产欧美一区二区精品忘忧草 | 国产精品国产三级国产专区53| 亚洲性感美女99在线| 亚洲在线不卡| 亚洲国产精品福利| 亚洲麻豆一区| 国产综合色产| 亚洲国产视频直播| 国产精品久久久久久久久| 欧美有码视频| 欧美高清视频一二三区| 欧美在线一二三四区| 久色婷婷小香蕉久久| 欧美国产一区视频在线观看| 亚洲夜晚福利在线观看| 午夜精品理论片| 亚洲欧洲日韩女同| 午夜精品亚洲| 夜夜嗨av一区二区三区四区| 午夜久久tv| 亚洲精品一区二区三区av| 亚洲一区二区三区免费在线观看 | 国产一区二区日韩精品欧美精品 | 日韩亚洲欧美中文三级| 国内精品国语自产拍在线观看| 亚洲国产高清高潮精品美女| 国产欧美日韩免费看aⅴ视频| 亚洲激情av| 亚洲第一精品夜夜躁人人躁| 中文欧美日韩| 日韩一区二区久久| 久久精品亚洲精品国产欧美kt∨| 中文日韩电影网站| 欧美福利一区二区| 免费日韩av电影| 国产性做久久久久久| 中文亚洲视频在线| 国产精品99久久久久久人| 蜜桃久久av一区| 卡通动漫国产精品| 国内精品久久久| 欧美一区二区大片| 欧美一区三区二区在线观看| 国产精品大片| 亚洲小视频在线| 午夜精品久久| 国产精品国产三级国产| 99国产精品久久久| 中文亚洲视频在线| 欧美三级资源在线| 一本久久综合| 亚洲午夜电影在线观看| 欧美日本国产在线| 亚洲精选视频在线| 亚洲特级毛片| 国产精品久久久久久户外露出 | 91久久精品美女高潮| 久久一区二区视频| 欧美激情亚洲视频| 一本到12不卡视频在线dvd| 欧美激情精品久久久久久黑人| 亚洲第一网站| 99热在线精品观看| 久久精品国产99| 国产一区二区三区在线观看免费视频| 亚洲欧美日韩国产成人| 久久久国产亚洲精品| 国产综合香蕉五月婷在线| 久久精品国产亚洲高清剧情介绍| 久久激情五月激情| 亚洲国产高清在线观看视频| 欧美成人免费网站| 亚洲精选一区二区| 狠狠88综合久久久久综合网| 欧美中文字幕在线视频| 免费欧美日韩国产三级电影| 亚洲免费观看高清在线观看| 欧美丝袜一区二区三区| 午夜精品国产精品大乳美女| 久久综合久久综合久久| 99国产精品久久久久久久成人热| 国产精品黄视频| 久久青青草原一区二区| 亚洲人成网站999久久久综合| 亚洲视频网站在线观看| 国产日韩一区二区| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品一区二区三区在线观看| 香蕉久久夜色精品国产| 在线欧美三区| 国产精品久久久亚洲一区| 久久久另类综合| av72成人在线| 欧美成人精品在线| 性欧美暴力猛交另类hd| 亚洲精品国产品国语在线app| 国产精品男gay被猛男狂揉视频| 久久久亚洲高清| 亚洲一区二区三区午夜| 亚洲国产成人不卡| 久久免费国产精品| 午夜电影亚洲| 在线视频免费在线观看一区二区| 一区福利视频| 国产一区999| 欧美日韩在线免费| 久久久人成影片一区二区三区观看 | 亚洲欧美国产另类| 亚洲精品国产精品乱码不99按摩| 国产精品一区久久久| 欧美美女喷水视频| 老司机精品视频一区二区三区| 亚洲免费在线| 一本色道久久精品| 亚洲国产专区校园欧美| 蜜臀av性久久久久蜜臀aⅴ| 欧美一激情一区二区三区| 亚洲影院免费观看| 亚洲一区二区精品在线观看| 亚洲日本va在线观看| ●精品国产综合乱码久久久久|