The Troublesome Frog--POJ 1054

1、题目类型:模拟、暴力法。

2、解题思路:(1)根据输入建立跳点的pos[]数组和标识位置的map[][]矩阵;(2)对跳点按照其横坐标进行排序;(3)暴力法遍历排序好的的跳点比较获得最大的步数,时间复杂度为nlog(n)。

3、注意事项:注意青蛙从区域的外面跳入,必须沿着直线方向跳出区域。

4、实现方法:

  
    
#include < iostream >
#include
< algorithm >
using namespace std;

struct Point
{
int x,y;
};

int R,C,cnt;
Point pos[
5010 ];
bool map[ 5010 ][ 5010 ];

int cmp(Point A,Point B)
{
if (A.x == B.x)
return A.y < B.y;
else
return A.x < B.x;
}

void Solve()
{
int i,j,CC,ans =- 1 ;
int disx,disy,tmpx,tmpy;
sort(pos,pos
+ cnt,cmp);
for (i = 0 ;i < cnt;i ++ )
{
for (j = i + 1 ;j < cnt;j ++ )
{
disx
= pos[j].x - pos[i].x;
disy
= pos[j].y - pos[i].y;
tmpx
= pos[j].x;
tmpy
= pos[j].y;
CC
= 2 ;
if ((pos[i].x - disx >= 1 && pos[i].x - disx <= R && pos[i].y - disy >= 1 && pos[i].y - disy <= C))
continue ;
while (tmpx + disx >= 1 && tmpx + disx <= R && tmpy + disy >= 1 && tmpy + disy <= C)
{
if (map[tmpx + disx][tmpy + disy])
{
tmpx
= tmpx + disx;
tmpy
= tmpy + disy;
CC
++ ;
}
else
goto L;
}
if (CC > ans)
ans
= CC;
L:
;
}
}

if (ans < 3 )
cout
<< ' 0 ' << endl;
else
cout
<< ans << endl;
}

int main()
{
int i;
cin
>> R >> C;
cin
>> cnt;
memset(map,
0 , sizeof (map));
for (i = 0 ;i < cnt;i ++ )
{
cin
>> pos[i].x >> pos[i].y;
map[pos[i].x][pos[i].y]
= 1 ;
}
Solve();
return 0 ;
}

 

你可能感兴趣的:(poj)