POJ 1054 The Troublesome Frog(枚举+剪枝)

题目链接

题意 :给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并踩倒,确保青蛙的每次跳跃的长度相同,且路线是直线,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数。

思路 : 暴力了一下,顺便剪剪枝就可以过。。。。

 1 //POJ1054

 2 #include <stdio.h>

 3 #include <string.h>

 4 #include <iostream>

 5 #include <algorithm>

 6 

 7 using namespace std ;

 8 

 9 struct node{

10 int row,col ;

11 }plant[5010];

12 int ab[5010][5010] ;

13 int r,c,n ;

14 

15 bool cmp(const node a,const node b)

16 {

17     if(a.row == b.row)

18         return a.col < b.col ;

19     return a.row < b.row ;

20 }

21 bool judge(int x,int y)

22 {

23     if(x > 0 && x <= r && y > 0 && y <= c) return true ;

24     return false ;

25 }

26 

27 int xxxx(int x,int y,int dx,int dy)

28 {

29     int cnt = 0  ;

30     while(judge(x,y))

31     {

32         if(!ab[x][y]) return 0 ;//会出现交叉路径所得

33         cnt ++ ;

34         x += dx ;

35         y += dy ;

36     }

37     return cnt ;

38 }

39 

40 int main()

41 {

42     scanf("%d %d %d",&r,&c,&n) ;

43     memset(ab,0,sizeof(ab)) ;

44     for(int i = 0 ; i < n ; i++)

45     {

46         scanf("%d %d",&plant[i].row,&plant[i].col) ;

47         ab[plant[i].row][plant[i].col]  = 1 ;

48     }

49     sort(plant,plant+n,cmp) ;

50     int cnt = 2 ;

51     for(int i = 0 ; i < n ; i++)

52     {

53         for(int j = i+1 ; j < n ; j++)

54         {

55             int dx = plant[j].row-plant[i].row ;

56             int dy = plant[j].col-plant[i].col ;

57             if(plant[i].row + cnt *dx > r || cnt*dy + plant[i].col>c) continue ;//青蛙的起点肯定在稻田外;

58             if(judge(plant[i].row-dx,plant[i].col-dy)) continue ;//该点的直线上的脚印一定要大于上一次的点数;

59             if(!judge(plant[i].row + cnt*dx,plant[i].col+cnt * dy)) continue ;//多于上一点的基础上点要在稻田内;

60             cnt = max(cnt,xxxx(plant[i].row,plant[i].col,dx,dy)) ;

61         }

62     }

63     if(cnt < 3)

64         printf("0\n") ;

65     else printf("%d\n",cnt) ;

66     return 0 ;

67 }
View Code

 

你可能感兴趣的:(poj)