在一個(gè)夜黑風(fēng)高,伸手不見(jiàn)五指的深夜,睡夢(mèng)中的林月如突然聽(tīng)到房外一陣躁動(dòng)。她出去一看,發(fā)現(xiàn)一個(gè)女飛賊搶了一個(gè)古董商的包袱。
"站?。?
"那你為什么不來(lái)追我?"
"因?yàn)槌绦蛟O(shè)計(jì),在李大哥來(lái)之前,我不能追你。"
"那李逍遙為什么不來(lái)呢?"
"大概程序出bug了吧"
………………………………………………
終于,在等了一個(gè)又一個(gè)時(shí)辰后,林月如終于忍不住了,開(kāi)始向女飛賊發(fā)起進(jìn)攻。
"喂!你為什么可以動(dòng)???"
"這大概也是一個(gè)bug吧!"
"不公平??!"
"廢話少說(shuō)。"
已知林月如和女飛賊站在一個(gè)矩陣中,矩陣中有某些障礙物不可穿越。月如使出的銅錢(qián)鏢可攻擊8個(gè)方向,但不可穿越障礙物(可視為不能穿墻的重狙)。每個(gè)單位時(shí)間,月如可向上下左右4個(gè)方向移動(dòng)一格,攻擊不浪費(fèi)時(shí)間。當(dāng)然,月如想盡快結(jié)束這場(chǎng)無(wú)聊的戰(zhàn)斗,所以她想在最短的時(shí)間內(nèi)消滅女飛賊。
第一行為2個(gè)數(shù)N,M表示矩陣的規(guī)模(N為高,M為寬)。
接下來(lái)是N*M的矩陣,O表示空地,X表示障礙物。
下面是若干行數(shù)據(jù),每行為一對(duì)數(shù)據(jù),分別是女飛賊的位置和林月如的位置,顯然她們都不可能在障礙物上。
每一組數(shù)據(jù)輸出一行,僅一個(gè)整數(shù),表示能消滅掉女飛賊的最短時(shí)間。
顯然若能直接打到女飛賊,則時(shí)間為0。
若無(wú)法消滅,則輸出"Impossible!"。(不含引號(hào))
對(duì)于30%的數(shù)據(jù),有N*M<=100
對(duì)于50%的數(shù)據(jù),有N*M<=400
對(duì)于100%的數(shù)據(jù),有N*M<=20000
對(duì)于100%的數(shù)據(jù),測(cè)試數(shù)據(jù)組數(shù)不超過(guò)20組
本來(lái)可以一次AC的題目,一些比較具有相似性的句子在復(fù)制的時(shí)候忘了修改了,把'+'寫(xiě)成了'-',第一次提交只得了30分,百思不得其解……
我的思路是廣搜出月如所在的點(diǎn)可以到達(dá)的其他點(diǎn)需要多少時(shí)間可以到達(dá),然后把女飛飛所在的點(diǎn)向八個(gè)方向擴(kuò)展,ans=maxint,ans=min(ans,s[i][j])。m*n<=20000,二維數(shù)組[20000][20000]肯定會(huì)爆,應(yīng)該用一維數(shù)組表示,但是數(shù)據(jù)很弱,用[200][200]可以AC。
以下是我的代碼:
#include<stdio.h>
#define min(a,b) (a<b?a:b)
#define maxint 200000000

/**//*
0 可到達(dá)的點(diǎn)
-1 障礙物
maxint 不可到達(dá)的點(diǎn)
*/
struct queue


{
long xi[20001],yi[20001],front,rear,count;
}q;
int empty()


{
return (q.count==0);
}
void clear()


{
q.front=0;
q.rear=-1;
q.count=0;
}
void put(long x,long y)


{
q.count++;
q.rear++;
q.xi[q.rear]=x;
q.yi[q.rear]=y;
}
void get(long *x,long *y)


{
q.count--;
*x=q.xi[q.front];
*y=q.yi[q.front];
q.front++;
}
int main()


{
char tmp,ch,map[201][201];

long m,n,x1,y1,x2,y2,i,j,xx,yy,s[201][201]=
{0};

long xd[]=
{0/**//**/,-1,-1,0,1,1,1,0,-1};

long yd[]=
{0/**//**/,0,1,1,1,0,-1,-1,-1};

scanf("%ld%ld\n",&m,&n);
for(i=1;i<=m;i++)

{
for(j=1;j<=n;j++)
scanf("%c",&map[i][j]);
scanf("%c",&tmp);
}
scanf("%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
//------Read In
while(x1!=0||x2!=0||y1!=0||y2!=0)

{
//------BFS
long ans=maxint;
clear();
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)

{
if(map[i][j]=='O')
s[i][j]=maxint;
else if(map[i][j]=='X')
s[i][j]=-1;
}
s[x2][y2]=0;
put(x2,y2);
while(!empty())

{
get(&xx,&yy);
if(xx>=2&&s[xx-1][yy]!=-1&&s[xx-1][yy]==maxint&&(xx-1!=x2||yy!=y2))

{
put(xx-1,yy);
s[xx-1][yy]=s[xx][yy]+1;
}
if(xx+1<=m&&s[xx+1][yy]!=-1&&s[xx+1][yy]==maxint&&(xx+1!=x2||yy!=y2))

{
put(xx+1,yy);
s[xx+1][yy]=s[xx][yy]+1;
}
if(yy>=2&&s[xx][yy-1]!=-1&&s[xx][yy-1]==maxint&&(xx!=x2||yy-1!=y2))

{
put(xx,yy-1);
s[xx][yy-1]=s[xx][yy]+1;
}
if(yy+1<=n&&s[xx][yy+1]!=-1&&s[xx][yy+1]==maxint&&(xx!=x2||yy+1!=y2))

{
put(xx,yy+1);
s[xx][yy+1]=s[xx][yy]+1;
}
}
for(i=1;i<=8;i++)

{
xx=x1+xd[i];
yy=y1+yd[i];
while( s[xx][yy]!=-1 && xx>=1 && xx<=m && yy>=1 && yy<=n )

{
ans=min(ans,s[xx][yy]);
xx+=xd[i];
yy+=yd[i];
}
}
if(ans!=maxint)
printf("%ld\n",ans);
else
printf("Impossible!\n");
scanf("%ld %ld %ld %ld",&x1,&y1,&x2,&y2);
}
return 0;
}

posted on 2010-01-06 18:36
lee1r 閱讀(1084)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
題目分類(lèi):搜索