zoukankan      html  css  js  c++  java
  • POJ 1054 The Troublesome Frog(枚举 + 剪枝)

    题意:

    http://blog.csdn.net/politropix/article/details/8456551

    思路:

    1. 首先针对 x 从小到大排序,然后枚举,这样为后面的剪枝提供了方便;

    2. 对于剪枝,因为题目中明确说了:青蛙是从外面跳进来,至少踩了 3 个黑点,然后跳出去的,于是可以加下面剪枝:

       a. 确定 2 点之间的间距之后,确定出发点之前的那个点是否在稻田外面,如果不是则剪枝;

       b. 根据当前最优情况,确定当前的点只要要走多少步才能找到一个更优解,相当于是一个启发式的剪枝;

     

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 5010;
    
    bool G[MAXN][MAXN];
    
    struct POINT {
        int x, y;
        bool operator < (const POINT& other) {
            if (x == other.x)
                return y < other.y;
            return x < other.x;
        }
    } P[MAXN];
    
    int row, col, N;
    
    bool judge(int x, int y) {
        if (0 < x && x <= row && 0 < y && y <= col) {
            return true;
        }
        return false;
    }
    
    int workout() {
        int ans = 2;
        for (int i = 0; i < N-1; i++) {
            for (int j = i+1; j < N; j++) {
                int dx = P[j].x - P[i].x;
                int dy = P[j].y - P[i].y;
    
                if (P[j].x + (ans-2)*dx > row)
                    break;
                if (P[j].y + (ans-2)*dy > col || P[j].y + (ans-2)*dy < 1)
                    continue;
                if (judge(P[i].x-dx, P[i].y-dy))
                    continue;
    
                int t = 1;
                int x = P[j].x, y = P[j].y;
                while (judge(x, y) && G[x][y]) {
                    x += dx, y += dy, t += 1;
                }
                if (!judge(x+dx, y+dy)) 
                    ans = max(ans, t);
            }
        }
        return ans > 2 ? ans : 0;
    }
    
    int main() {
        while (~scanf("%d%d", &row, &col)) {
            scanf("%d", &N);
            memset(G, false, sizeof(G));
            for (int i = 0; i < N; i++) {
                scanf("%d%d", &P[i].x, &P[i].y);
                G[P[i].x][P[i].y] = true;
            }
            sort(P, P + N);
            printf("%d\n", workout());
        }
        return 0;
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    js 鼠标事件大全
    ASP.NET 解决重复提交问题
    C# 统计函数运行时间
    DataGrid 、Repeater、DataList、GridView自动编号列
    两种时间格式正则表达式HH:mm 和HH:mm:ss
    SQL Server2008 新语法
    XYTipsWindow 2.8
    MSSQL 清空日志
    SQL 日期格式化大全
    HDOJ 2132
  • 原文地址:https://www.cnblogs.com/kedebug/p/2998659.html
Copyright © 2011-2022 走看看