zoukankan      html  css  js  c++  java
  • P1141 01迷宫 (记忆化搜索)

    题目链接:https://www.luogu.org/problem/P1141

    这题目就尼玛的傻逼题 (如果出现a-b-c的路可以走,那么从b出发可达到的最多的地点和从a出发是一样的!) 

    思路:

    根据题目的要求,我把此时出发的点一直到最后走过最多点时的终点全部记录下来,那么无论如何从这些点出发走过的最多点点个数都是一样的,那么就可以搞成记忆化搜索了

     1 #include <math.h>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <iostream>
     5 #include <algorithm>
     6 #include <string>
     7 #include <string.h>
     8 #include <vector>
     9 #include <map>
    10 #include <stack>
    11 #include <set>
    12 #include <queue>
    13 
    14 
    15 #define LL long long
    16 #define INF 0x3f3f3f3f
    17 #define ls nod<<1
    18 #define rs (nod<<1)+1
    19 const int maxn = 4e5+10;
    20 const double eps = 1e-9;
    21 
    22 int n,m,cnt;
    23 int a[1010][1010],res[1010][1010];
    24 int dik[1000010][2];
    25 int dir[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    26 
    27 void dfs(int row,int col) {
    28     cnt++;
    29     dik[cnt][0] = row;
    30     dik[cnt][1] = col;
    31     res[row][col] = 1;
    32     for (int i=0;i<4;i++) {
    33         int new_row = row + dir[i][0];
    34         int new_col = col + dir[i][1];
    35         if (new_row<1 || new_col<1 || new_row>n || new_col>n || res[new_row][new_col]) {
    36             continue;
    37         }
    38         if (a[new_row][new_col] == a[row][col]) {
    39             continue;
    40         }
    41         dfs(new_row,new_col);
    42     }
    43 }
    44 
    45 int main() {
    46     scanf("%d%d",&n,&m);
    47     for (int i=1;i<=n;i++) {
    48         for (int j=1;j<=n;j++) {
    49             scanf("%1d",&a[i][j]);
    50         }
    51     }
    52     for (int i=1;i<=m;i++) {
    53         cnt = 0;
    54         int row,col;
    55         scanf("%d%d",&row,&col);
    56         if (res[row][col] > 0) {
    57             printf("%d
    ",res[row][col]);
    58             continue;
    59         }
    60         dfs(row,col);
    61         for (int j=1;j<=cnt;j++) {
    62             res[dik[j][0]][dik[j][1]] = cnt;
    63         }
    64         printf("%d
    ",cnt);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    SQL Sever语言 存储过程及触发器
    计蒜客 挑战难题 移除数组中的重复元素
    projecteuler Sum square difference
    码农谷 求前N项之和
    projecteuler Smallest multiple
    计蒜客 挑战难题 寻找插入位置
    Largest palindrome product
    计蒜客 挑战难题 元素移除
    码农谷 球从M米高度自由下落第N次落地时反弹的高度
    挑战难题 奇怪的国家
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11861998.html
Copyright © 2011-2022 走看看