MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

pku 1915

Posted on 2011-04-27 15:58  MDeath-Kid  阅读(984)  评论(0编辑  收藏  举报

http://poj.org/problem?id=1915

第一次A,BFS的题,最简单的一道。

1 /*ACMer:MDK
2 MDK 1915 Accepted 1388K 110MS G++ 1437B 2011-04-27 11:51:15 */
3 #include <iostream>
4 #include <stdio.h>
5 #include <queue>
6 #include <string.h>
7 #define MAXN 300
8 using namespace std;
9 typedef struct fix
10 {
11 int x,y;
12 }fix;
13 fix p[8]={{-2,-1},{-1,-2},{1,-2},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};
14
15 fix operator+(fix Ta,fix Tb)
16 {
17 fix Tc;
18 Tc.x = Ta.x+Tb.x;
19 Tc.y = Ta.y+Tb.y;
20 return Tc;
21 }
22 bool operator==(fix Ta,fix Tb)
23 {
24 if(Ta.x==Tb.x&&Ta.y==Tb.y)
25 return 1;
26 else
27 return 0;
28 }
29 int matv[MAXN][MAXN]={0},step[MAXN][MAXN]={0};
30 queue<fix> quep;
31 int BFS(int l,fix a,fix b)
32 {
33 memset(matv,0,sizeof(matv));
34 memset(step,0,sizeof(step));
35 while(!quep.empty()) quep.pop();
36 fix temp,Tp;
37 quep.push(a);
38 int t=0;
39 while(!quep.empty())
40 {
41 temp = quep.front();quep.pop();
42 if(temp==b) return step[temp.x][temp.y];
43 t=step[temp.x][temp.y]+1;
44 for(int i =0;i<8;i++)
45 {
46 Tp = p[i]+temp;
47 if(Tp.x<0||Tp.y<0||Tp.x>=l||Tp.y>=l||matv[Tp.x][Tp.y]) continue;
48 quep.push(Tp);
49 matv[Tp.x][Tp.y]=1;
50 step[Tp.x][Tp.y]=t;
51 }
52 }
53 return t;
54 }
55 int main()
56 {
57 freopen("d:\\2.txt","r",stdin);
58 int cases;
59 cin>>cases;
60 while(cases--)
61 {
62 int l;
63 fix a,b;
64 scanf("%d",&l);
65 scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
66 cout<<BFS(l,a,b)<<endl;
67 }
68 return 0;
69 }

自我感觉代码不算美~,用的queue,效率也不是很高。

下面的是双向的BFS,自己练习一下。可以看出时间快了大概40%

双向BFS
/*ACMer:MDK
MDK 1915 Accepted 1780K 79MS G++ 2425B 2011-04-27 18:38:48
*/
#include
<iostream>
#include
<stdio.h>
#include
<queue>
#include
<string.h>
#define MAXN 305
using namespace std;
typedef
struct fix
{
int x,y;
}fix;
fix p[
8]={{-2,-1},{-1,-2},{1,-2},{2,-1},{-2,1},{-1,2},{1,2},{2,1}};

fix
operator+(fix Ta,fix Tb)
{
fix Tc;
Tc.x
= Ta.x+Tb.x;
Tc.y
= Ta.y+Tb.y;
return Tc;
}
bool operator==(fix Ta,fix Tb)
{
if(Ta.x==Tb.x&&Ta.y==Tb.y)
return 1;
else
return 0;
}
int matv[MAXN][MAXN]={0},step[MAXN][MAXN]={0},step2[MAXN][MAXN]={0};//两个方向的step记录步数
queue<fix> quep,quep2;
int BFS(int l,fix a,fix b)
{
memset(matv,
0,sizeof(matv));
memset(step,
0,sizeof(step));
memset(step2,
0,sizeof(step2));
while(!quep.empty()) quep.pop();
while(!quep2.empty()) quep2.pop();
fix temp,Tp,temp2,Tp2;
quep.push(a);
quep2.push(b);
matv[a.x][a.y]
=1;
matv[b.x][b.y]
=-1;//初始化
int t=0,t2=0;
while(!quep.empty()&&!quep2.empty())
{
temp
= quep.front();quep.pop();
temp2
= quep2.front();quep2.pop();
if(temp==temp2) return step[temp.x][temp.y]+step2[temp2.x][temp2.y];
t
=step[temp.x][temp.y]+1;
t2
=step2[temp2.x][temp2.y]+1;
for(int i =0;i<8;i++)
{
Tp
= p[i]+temp;
if(Tp.x<0||Tp.y<0||Tp.x>=l||Tp.y>=l||step[Tp.x][Tp.y]) continue;
if(matv[Tp.x][Tp.y]==0)
{
quep.push(Tp);
matv[Tp.x][Tp.y]
=1;//一个标记为1
step[Tp.x][Tp.y]=t;
}
else if(matv[Tp.x][Tp.y]==-1)
{
return t+step2[Tp.x][Tp.y];
}
}
for(int i = 0;i<8;i++)
{
Tp2
= p[i] +temp2;
if(Tp2.x<0||Tp2.y<0||Tp2.x>=l||Tp2.y>=l||step2[Tp2.x][Tp2.y]) continue;
if(matv[Tp2.x][Tp2.y]==0)
{
quep2.push(Tp2);
matv[Tp2.x][Tp2.y]
=-1;//另一个标记为-1,因为这个WA了一次。
step2[Tp2.x][Tp2.y]=t2;
}
else if(matv[Tp2.x][Tp2.y]==1)
{
return step[Tp2.x][Tp2.y]+t2;
}

}

}
return t;
}
int main()
{
freopen(
"d:\\2.txt","r",stdin);
int cases;
cin
>>cases;
while(cases--)
{
int l;
fix a,b;
scanf(
"%d",&l);
scanf(
"%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
cout
<<BFS(l,a,b)<<endl;
}
return 0;
}