zoukankan      html  css  js  c++  java
  • HDU-4255 BFS 最短路

    题意:蛇形填数,然后素数处是障碍,给你起点终点,求步数;

    思路:其实就是bfs,关键是将数字转换成位置比较难;

    bfs其实比较简单,就是固定的思路,固定的步骤;

    模板:

     1 const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
     2 int vis[maxn], d[maxn];
     3 bool is_ok(int x, int y)///坐标是否合格,按照题意来进行
     4 {
     5     if(x<0 || y<0||x>n||y>n)
     6         return false;
     7     return true;
     8 }
     9 int dfs(Node st,Node ed)///起点终点
    10 {
    11     queue<Node> q;
    12     q.push(st);///压进起点
    13     memset(vis,0,sisteof(vis));
    14     memset(d,0,sizeof(d));
    15     int ss = a[st.x][st.y];
    16     d[ss] = 0;
    17     int edd = a[ed.x][ed.y];
    18     while(!q.empty())
    19     {
    20         Node c = q.front(),v;
    21         q.pop();
    22         int stt = a[c.x][c.y];
    23         if(stt == edd)///先判断是否到达终点
    24             return d[stt];
    25         repu(i,0,4)
    26         {
    27             v.x = c.x + dir[i][0];
    28             v.y = c.y + dir[i][1];
    29             if(is_ok(v.x,v.y))///坐标是否合格
    30             {
    31                 int sd = a[v.x][v.y];
    32                 if(!vis[sd])///符合所有条件后
    33                 {
    34                     q.push(v);///压进
    35                     vis[sd] = 1;///V过
    36                     d[sd] = d[stt] + 1;///步数为之前的+1
    37                 }
    38             }
    39             else
    40                 continue;
    41         }
    42     }
    43     return -1;
    44 }
    View Code

    该题代码

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cmath>
      4 #include <cstring>
      5 #include <cstdlib>
      6 #include <string>
      7 #include <vector>
      8 #include <algorithm>
      9 #include<queue>
     10 #include <set>
     11 #define repu(i,a,b) for(int i=a;i<b;i++)
     12 using namespace std;
     13 #define N 1000010
     14 #define ll long long
     15 #define _cle(m, a) memset(m, a, sizeof(m))
     16 const int maxn = 1000010;
     17 const int mn = 500;
     18 int tot;
     19 int a[1100][1100];
     20 struct Node
     21 {
     22     int x, y;
     23 } nodes[maxn];
     24 void init()
     25 {
     26     memset(a, 0, sizeof(a));
     27     a[mn][mn] = 1;
     28     tot = 1;
     29     nodes[1].x = mn;
     30     nodes[1].y = mn;
     31     int cur = 1;
     32     int i = mn, j = mn+1;
     33     while(tot <= maxn)
     34     {
     35         int t;
     36         t = 0;
     37         i++;
     38         while(t < cur*2)
     39         {
     40             a[--i][j] = ++tot;
     41             nodes[tot].x = i;
     42             nodes[tot].y = j;
     43             t++;
     44         }
     45         t = 0;
     46         while(t < cur*2)
     47         {
     48             a[i][--j] = ++tot;
     49             nodes[tot].x = i;
     50             nodes[tot].y = j;
     51             t++;
     52         }
     53         t = 0;
     54         while(t < cur*2)
     55         {
     56             a[++i][j] = ++tot;
     57             nodes[tot].x = i;
     58             nodes[tot].y = j;
     59             t++;
     60         }
     61         t = 0;
     62         while(t < cur*2)
     63         {
     64             a[i][++j] = ++tot;
     65             nodes[tot].x = i;
     66             nodes[tot].y = j;
     67             t++;
     68         }
     69         ++j;
     70         cur++;
     71     }
     72 }
     73 int prime[maxn];
     74 void is_prime()
     75 {
     76     memset(prime, 0, sizeof(prime));
     77     int m = sqrt(maxn+0.5);
     78     prime[0] = prime[1] = 1;
     79     for(int i = 2; i <= m; i++)
     80     {
     81         if(!prime[i])
     82         {
     83             for(int j = i*i; j <= maxn; j+=i)
     84             {
     85                 prime[j] = 1;
     86             }
     87         }
     88     }
     89 }
     90 
     91 const int dir[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
     92 int vis[maxn], d[maxn];
     93 bool is_ok(int x, int y)
     94 {
     95     return x>=0 && y >=0;
     96 }
     97 int bfs(Node z,Node b)
     98 {
     99     queue<Node> q;
    100     q.push(z);
    101     memset(vis,0,sizeof(vis));
    102     memset(d,0,sizeof(d));
    103     int ss = a[z.x][z.y];
    104     d[ss] = 0;
    105     int ed = a[b.x][b.y];
    106     while(!q.empty())
    107     {
    108         Node c = q.front(),v;
    109         q.pop();
    110         int st = a[c.x][c.y];
    111         if(st == ed)
    112             return d[st];
    113         repu(i,0,4)
    114         {
    115             v.x = c.x + dir[i][0];
    116             v.y = c.y + dir[i][1];
    117             if(is_ok(v.x,v.y))
    118             {
    119                 int sd = a[v.x][v.y];
    120                 if(!vis[sd]&&prime[sd])
    121                 {
    122                     q.push(v);
    123                     vis[sd] = 1;
    124                     d[sd] = d[st] + 1;
    125                 }
    126             }
    127             else
    128                 continue;
    129         }
    130     }
    131     return -1;
    132 }
    133 int main()
    134 {
    135     init();
    136     is_prime();
    137     int x, y, kase = 0;
    138     while(~scanf("%d%d", &x, &y))
    139     {
    140         if(!prime[x] || !prime[y])
    141         {
    142             printf("Case %d: impossible
    ", ++kase);
    143             continue;
    144         }
    145         int ans = bfs(nodes[x], nodes[y]);
    146         if(ans == -1) printf("Case %d: impossible
    ", ++kase);
    147         else printf("Case %d: %d
    ", ++kase, ans);
    148     }
    149 
    150     return 0;
    151 }
    View Code
  • 相关阅读:
    验证整数或小数
    数据库的连接查询比较
    批处理按钮
    事务 SQL
    关于GridView模板的一些总结
    C#数据结构之线性表
    C#面向对象基础
    C#集合类:动态数组、队列、栈、哈希表、字典
    如何更改master中WebParts中自定义控件的值。
    如何取得web.config中connectings中的值
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4437905.html
Copyright © 2011-2022 走看看