• HDU 4478 Where is King


    题目大意:

    一个王可以向周围8个方格走,如果都不通留在原地,t秒后,他可能存在的位置数

    这题数据量过大,我们需要通过奇偶性判断,如果t = 0可以到达,说明 t=2,4,6.。。。都可以到达

    所以我这用dp[N][N][2] 来记录x,y位置上奇数和偶数时间分别到达那点的最短时间,如果不存在,用-1表示

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 using namespace std;
     6 const int N = 105;
     7 int dp[N][N][2],n,t,x,y,vis[N][N];
     8 char mat[N][N];
     9 int dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,-1},{1,1},{-1,1},{-1,-1}};
    10 
    11 struct Node{
    12     int x,y;
    13     Node(int x,int y):x(x),y(y){}
    14 };
    15 
    16 queue<Node> q;
    17 
    18 void bfs()
    19 {
    20     q.push(Node(x,y));
    21     vis[x][y] = 1;
    22     while(!q.empty()){
    23         Node t = q.front();
    24         q.pop();
    25         vis[t.x][t.y]=0;
    26 
    27         for(int i=0;i<8;i++){
    28             int xx = t.x + dir[i][0];
    29             int yy = t.y + dir[i][1];
    30             if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&mat[xx][yy] == '.'){
    31                 int flag = 0;
    32                 if((dp[xx][yy][0] < 0 || dp[xx][yy][0] > dp[t.x][t.y][1] + 1) && dp[t.x][t.y][1] >= 0)
    33                 {
    34                     dp[xx][yy][0] = dp[t.x][t.y][1] + 1;
    35                     flag = 1;
    36                 }
    37                 if((dp[xx][yy][1] < 0 || dp[xx][yy][1] > dp[t.x][t.y][0] + 1) && dp[t.x][t.y][0] >= 0)
    38                 {
    39                     dp[xx][yy][1] = dp[t.x][t.y][0] + 1;
    40                     flag = 1;
    41                 }
    42 
    43                 if(flag && !vis[xx][yy])
    44                 {
    45                     vis[xx][yy]=1;
    46                     q.push(Node(xx,yy));
    47                 }
    48             }
    49         }
    50     }
    51 }
    52 int main()
    53 {
    54     //freopen("test.in","rb",stdin);
    55     //cout << "Hello world!" << endl;
    56     int C;
    57     scanf("%d",&C);
    58     while(C--){
    59         scanf("%d%d%d%d",&n,&t,&x,&y);
    60         for(int i=1;i<=n;i++)
    61             scanf("%s",mat[i]+1);
    62 
    63         memset(vis,0,sizeof(vis));
    64         memset(dp,-1,sizeof(dp));
    65         dp[x][y][0]=0;
    66 
    67         bfs();
    68 
    69         int tmp = t&1;
    70         int ans = 0;
    71         for(int i=1;i<=n;i++){
    72             for(int j=1;j<=n;j++){
    73                 if(dp[i][j][tmp]!=-1 && dp[i][j][tmp]<=t)
    74                     ans++;
    75             }
    76         }
    77         printf("%d
    ",max(ans,1));
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    花匠
    积木
    Hello world
    老鼠走迷宫全部路径
    今天下午选做题目
    整数高精度运算——加法
    博客启航
    解线性不定方程
    关于完全背包问题
    关于最小代价子母树
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4034099.html
Copyright © 2020-2023  润新知