• kuangbin专题一 简单搜索


    弱菜做了好久23333333........

    传送门: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105278#overview

    A 只能摆k个棋子,只能摆在#

     1 #include <cstring>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 const int max_n = 10;
     6 char maze[max_n][max_n];
     7 bool vis[max_n];
     8 int n, m, ans, cnt;
     9 void init(){
    10     memset(maze, 0, sizeof(maze));
    11     ans = cnt = 0;
    12 }
    13 void dfs(int k){
    14     if(cnt == m){ ++ans; return ; }
    15     if(k > n) return ;
    16     for(int i = 0; i < n; ++i){
    17         if(maze[i][k] == '#' && !vis[i]){
    18             vis[i] = 1; ++cnt;
    19             dfs(k+1);
    20             vis[i] = 0; --cnt;
    21         }
    22     }
    23     dfs(k+1);
    24 }
    25 int main(){
    26     ios::sync_with_stdio(false);
    27     while(cin >> n >> m){
    28         if(n == m && n == -1) break;
    29         init();
    30         for(int i = 0; i < n; ++i){
    31             cin.get();
    32             for(int j = 0; j < n; ++j) cin >> maze[i][j];
    33         }
    34         dfs(0);
    35         cout << ans << endl;
    36     }
    37     return 0;
    38 }
    View Code

    B 三维BFS

     1 #include <cstdio>
     2 #include <queue>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 const int max_n = 40;
     8 const int cx[] = {0, 1, 0, -1, 0, 0};
     9 const int cy[] = {1, 0, -1, 0, 0, 0};
    10 const int cz[] = {0, 0, 0, 0, 1, -1};
    11 int maze[max_n][max_n][max_n];
    12 bool vis[max_n][max_n][max_n];
    13 struct point{
    14     int x, y, z, step;
    15 };
    16 int L, R, C;
    17 int ex, ey, ez;
    18 int main(){
    19     ios::sync_with_stdio(false);
    20     while(cin >> L >> R >> C){
    21         if(L == 0 && R == 0 && C == 0) break;
    22         queue<point> q;
    23         memset(vis, 0, sizeof(vis));
    24         memset(maze, 0, sizeof(maze));
    25         for(int k = 0; k < L; ++k){
    26             for(int i = 0; i < R; ++i){
    27                 cin.get();
    28                 for(int j = 0; j < C; ++j){
    29                     char ch = cin.get();
    30                     if(ch == 'S'){
    31                         maze[k][i][j] = 1;
    32                         point p = {k, i, j, 0};
    33                         q.push(p);
    34                     }
    35                     else if(ch == '.') maze[k][i][j] = 1;
    36                     else if(ch == 'E'){
    37                         maze[k][i][j] = 1;
    38                         ex = k; ey = i; ez = j;
    39                     }
    40                 }
    41             }
    42             cin.get();
    43         }
    44         int x, y, z, step;
    45         while(!q.empty()){
    46             point p = q.front();
    47             q.pop();
    48             x = p.x, y = p.y, z = p.z, step = p.step;
    49             if(x == ex && y == ey && z == ez) break;
    50             for(int i = 0; i < 6; ++i){
    51                 int nx = x + cx[i], ny = y + cy[i], nz = z + cz[i];
    52                 if(nx<0||L<nx||ny<0||R<ny||nz<0||C<nz) continue;
    53                 if(maze[nx][ny][nz]){
    54                     maze[nx][ny][nz] = 0;
    55                     point tp = {nx, ny, nz, step + 1};
    56                     q.push(tp);
    57                 }
    58             }
    59         }
    60         if(x == ex && y == ey && z == ez) printf("Escaped in %d minute(s).
    ", step);
    61         else printf("Trapped!
    ");
    62     }
    63     return 0;
    64 }
    View Code

    C 搜......

     1 #include <cstdio>
     2 #include <queue>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 struct point{
     8     int x, step;
     9 };
    10 int S, E;
    11 int vis[100010];
    12 int main(){
    13     ios::sync_with_stdio(false);
    14     while(cin >> S >> E){
    15         memset(vis, 0, sizeof(vis));
    16         vis[S] = 1;
    17         queue<point> q;
    18         q.push(point{S, 0});
    19         int x, step;
    20         while(!q.empty()){
    21             point p = q.front();
    22             x = p.x; step = p.step;
    23             q.pop();
    24             if(x == E) break;
    25             for(int i = 0; i < 3; ++i){
    26                 int nx;
    27                 if(i == 0) nx = x + 1;
    28                 else if(i == 1) nx = x - 1;
    29                 else nx = x << 1;
    30                 if(0 <= nx && nx <= 100000 && !vis[nx]){ q.push(point{nx, step+1}); vis[nx] = 1; }
    31             }
    32         }
    33         cout << step << endl;
    34     }
    35     return 0;
    36 }
    View Code

    D 卡了好久看了题解  第一行确定下来后其他行的也都确定下来了(说的好有道理),所以枚举第一行状态,确定下其他行,看最后一行是否都是0

      然后在这道题发现了之前二进制枚举的一个错误....... 正确姿势:(i>>j) & 1(吧?)

     1 #include <cstdio>
     2 #include <cstdlib>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int MAXN = 20;
     9 const int INF = 0x3f3f3f3f;
    10 const int cx[] = {0, 0, -1, 0};
    11 const int cy[] = {1, -1, 0, 0};
    12 int n, m;
    13 int ans[MAXN][MAXN];
    14 int flip[MAXN][MAXN];
    15 int origin[MAXN][MAXN];
    16 
    17 int check(int x, int y){
    18     int cnt = origin[x][y];
    19     for(int i = 0; i < 4; ++i){
    20         int nx = x + cx[i], ny = y + cy[i];
    21         if(nx >= 0 && nx < n && ny >= 0 && ny < m)
    22             cnt += flip[nx][ny];
    23     }
    24     return cnt & 1;
    25 }
    26 
    27 int duang(){
    28     for(int i = 1; i < n; ++i)
    29         for(int j = 0; j < m; ++j)
    30             if(check(i-1, j)) flip[i][j] = 1;
    31     for(int j = 0; j < m; ++j)
    32         if(check(n-1, j)) return 0;
    33     int cnt = 0;
    34     for(int i = 0; i < n; ++i)
    35         for(int j = 0; j < m; ++j)
    36             cnt += flip[i][j];
    37     return cnt;
    38 }
    39 
    40 int main(){
    41     while(cin >> n >> m){
    42         memset(origin, 0, sizeof(origin));
    43         for(int i = 0; i < n; ++i)
    44             for(int j = 0; j < m; ++j)
    45                 cin >> origin[i][j];
    46         int tans = INF;
    47         for(int i = 0; i < (1<<m); ++i){
    48             memset(flip, 0, sizeof(flip));
    49             for(int j = 0; j < m; ++j)
    50                 flip[0][j] = (i>>j) & 1;
    51             int cnt = duang();
    52             if(cnt < tans && cnt != 0){
    53                 tans = cnt;
    54                 memcpy(ans, flip, sizeof(flip));
    55             }
    56         }
    57         if(tans == INF) cout << "IMPOSSIBLE" << endl;
    58         else{
    59             for(int i = 0; i < n; ++i)
    60                 for(int j = 0; j < m; ++j)
    61                     cout << ans[i][j] << " 
    "[j==m-1];
    62         }
    63     }
    64     return 0;
    65 }
    View Code

    E 听说答案都在long long范围内hhhh.......

     1 #include <queue>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 typedef long long ll;
     6 int main(){
     7     ios::sync_with_stdio(false);
     8     int n;
     9     while(cin >> n){
    10         if(n == 0) break;
    11         queue<ll> q;
    12         q.push(1LL);
    13         while(!q.empty()){
    14             ll k = q.front();
    15             q.pop();
    16             if(k % n == 0){
    17                 cout << k << endl;
    18                 break;
    19             }
    20             q.push(k*10);
    21             q.push(k*10+1);
    22         }
    23     }
    24     return 0;
    25 }
    View Code

    F GOJ有这道题........

     1 #include <map>
     2 #include <set>
     3 #include <queue>
     4 #include <deque>
     5 #include <cmath>
     6 #include <string>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cstdlib>
    10 #include <cstring>
    11 #include <utility>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 int m, n;
    16 bool isPrime[10010];
    17 int vis[10010];
    18 void preprocess(){
    19     memset(isPrime, true, sizeof(isPrime));
    20     isPrime[0] = isPrime[1] = false;
    21     for(int i = 2; i < 10000; ++i){
    22         if(isPrime[i]){
    23             for(int j = i; i*j < 10000; ++j){
    24                 isPrime[i*j] = false;
    25             }
    26         }
    27     }
    28 }
    29 void bfs(){
    30     memset(vis, 0, sizeof(vis));
    31     vis[m] = 1;
    32     queue<int> q;
    33     q.push(m);
    34     while(!q.empty()){
    35         int k = q.front();
    36         q.pop();
    37         int d[4] = {k/1000, k%1000/100, k%100/10, k%10};
    38         int b[4] = {1000, 100, 10, 1};
    39         for(int i = 0; i < 4; ++i){
    40             for(int j = 0; j < 10; ++j){
    41                 int t = k - d[i] * b[i] + j * b[i];
    42                 if(k == n) return ;
    43                 if(t > 999 && isPrime[t] && !vis[t]){
    44                     vis[t] = vis[k] + 1;
    45                     q.push(t);
    46                 }
    47             }
    48         }
    49     }
    50     return ;
    51 }
    52 int main(){
    53     ios::sync_with_stdio(false);
    54     preprocess();
    55     int t;
    56     cin >> t;
    57     while(t--){
    58         cin >> m >> n;
    59         bfs();
    60         if(vis[n]) cout << vis[n]-1 << endl;
    61         else cout << "Impossible" << endl;
    62     }
    63     return 0;
    64 }
    View Code

    G 水   直接模拟   略坑是第一张都是最底的一张

     1 #include <set>
     2 #include <string>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 
     8 int main(){
     9     int t;
    10     cin >> t;
    11     for(int x = 1; x <= t; ++x){
    12         int l;
    13         cin >> l;
    14         string str1, str2, desstr;
    15         cin >> str1 >> str2 >> desstr;
    16         int step = 0;
    17         set<string> s;
    18         s.insert(str1+str2);
    19         bool flag = true;
    20         while(flag){
    21             string tmpstr;
    22             for(int i = 0; i < l; ++i){
    23                 tmpstr += str2[i];
    24                 tmpstr += str1[i];
    25             }
    26             //cout << tmpstr << endl;
    27             ++step;
    28             if(tmpstr == desstr) break;
    29             if(s.count(tmpstr)){
    30                 flag = false;
    31                 break;
    32             }
    33             s.insert(tmpstr);
    34             str1 = tmpstr.substr(0, l);
    35             str2 = tmpstr.substr(l, 2*l);
    36             //cout << str1 << " "  << str2 << endl;
    37         }
    38         cout << x << ' ' << (flag ? step : -1) << endl;
    39     }
    40     return 0;
    41 }
    View Code

    H M题写吐了H不想做.......

    还是搜    6种状态

    I 暴力找两个#搜.......

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <iostream>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int INF =  0x3f3f3f;
     9 const int cx[4] = {0, 0, 1, -1};
    10 const int cy[4] = {1, -1, 0, 0};
    11 int n, m;
    12 int dis[15][15];
    13 char map[15][15];
    14 
    15 struct Point{
    16     int x, y;
    17     Point(){}
    18     Point(int xx, int yy) :x(xx), y(yy){}
    19 };
    20 queue<Point> q;
    21 int bfs(int x1, int y1, int x2, int y2){
    22     memset(dis, INF, sizeof(dis));
    23     q.push(Point(x1, y1));
    24     q.push(Point(x2, y2));
    25     dis[x1][y1] = 0;
    26     dis[x2][y2] = 0;
    27     while (!q.empty()){
    28         Point p = q.front();
    29         q.pop();
    30         for (int i = 0; i < 4; i++){
    31             int xx = p.x + cx[i], yy = p.y + cy[i];
    32             if (xx >= 0 && xx < n && yy >= 0 && yy<m && map[xx][yy] == '#' && dis[xx][yy] > dis[p.x][p.y] + 1){
    33                 dis[xx][yy] = dis[p.x][p.y] + 1;
    34                 q.push(Point(xx, yy));
    35             }
    36         }
    37     }
    38 
    39     int ret = 0;
    40     for (int i = 0; i < n; i++)
    41         for (int j = 0; j < m; j++)
    42             if (map[i][j] == '#')
    43                 ret = max(ret, dis[i][j]);
    44     return ret;
    45 }
    46 
    47 int main(){
    48     int t;
    49     cin >> t;
    50     for (int x = 1; x <= t; x++){
    51         while(!q.empty()) q.pop();
    52         cin >> n >> m;
    53         for (int i = 0; i < n; i++)
    54             cin >> map[i];
    55         int ans = INF;
    56         for (int i = 0; i < n; i++)
    57             for (int j = 0; j < m; j++)
    58                 if (map[i][j] == '#')
    59                     for (int ii = 0; ii < n; ii++)
    60                         for (int jj = 0; jj < m; jj++)
    61                             if (map[ii][jj] == '#'){
    62                                 int temp = bfs(i, j, ii, jj);
    63                                 ans = min(ans, temp);
    64                             }
    65         if (ans == INF) ans = -1;
    66         cout << "Case " << x << ": " << ans << endl;
    67     }
    68     return 0;
    69 }
    View Code

    J 多处火.....先处理火,再处理人,遇到可行的情况退出来

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 struct pos{
     5     int x, y;
     6     pos(int xx = 0, int yy = 0): x(xx), y(yy) {}
     7 };
     8 const int MAXN = 1111;
     9 const int INF = 0x7f7f7f7f;
    10 const int cx[] = {0, 0, 1, -1};
    11 const int cy[] = {1, -1, 0, 0};
    12 int n, m;
    13 int jx, jy, fx, fy;
    14 int maze[MAXN][MAXN];
    15 int jstep[MAXN][MAXN];
    16 int fstep[MAXN][MAXN];
    17 
    18 int main(){
    19     int t;
    20     cin >> t;
    21     while(t--){
    22         cin >> n >> m;
    23         queue<pos> qf;
    24         memset(fstep, -1, sizeof(fstep));
    25         for(int i = 0; i < n; ++i){
    26             cin.get();
    27             for(int j = 0; j < m; ++j){
    28                 char ch;
    29                 cin >> ch;
    30                 if(ch == '#') maze[i][j] = 0;
    31                 else{
    32                     maze[i][j] = 1;
    33                     if(ch == 'J'){
    34                         jx = i; 
    35                         jy = j;
    36                     }
    37                     else if(ch == 'F'){
    38                         fx = i;
    39                         fy = j;
    40                         qf.push(pos(fx, fy));
    41                         fstep[fx][fy] = 0;
    42                     }
    43                 }
    44             }
    45         }
    46         while(!qf.empty()){
    47             pos p = qf.front();
    48             int x = p.x, y = p.y;
    49             qf.pop();
    50             for(int i = 0; i < 4; ++i){
    51                 int nx = x + cx[i], ny = y + cy[i];
    52                 if(nx < 0 || n <= nx || ny < 0 || m <= ny || maze[nx][ny] == 0 || fstep[nx][ny] != -1) continue;
    53                 qf.push(pos(nx, ny));
    54                 fstep[nx][ny] = fstep[x][y] + 1;
    55             }
    56         }
    57         // cout << endl;
    58         // for(int i = 0; i < n; ++i){
    59         //     for(int j = 0; j < m; ++j)
    60         //         cout << fstep[i][j] << '	';
    61         //     cout << endl;
    62         // }
    63         memset(jstep, -1, sizeof(jstep));
    64         queue<pos> qj;
    65         qj.push(pos(jx, jy));
    66         jstep[jx][jy] = 0;
    67         int ans = -1;
    68         while(!qj.empty()){
    69             pos p = qj.front();
    70             int x = p.x, y = p.y;
    71             qj.pop();
    72             if(x == 0 || x == n-1 || y == 0 || y == m-1){
    73                 ans = jstep[x][y];
    74                 break;
    75             }
    76             for(int i = 0; i < 4; ++i){
    77                 int nx = x + cx[i], ny = y + cy[i];
    78                 if(nx < 0 || n <= nx || ny < 0 || m <= ny || maze[nx][ny] == 0 || jstep[nx][ny] != -1 || (fstep[nx][ny] != -1 && fstep[nx][ny] <= jstep[x][y] + 1)) continue;
    79                 qj.push(pos(nx, ny));
    80                 jstep[nx][ny] = jstep[x][y] + 1;
    81             }
    82         }
    83         // cout << endl;
    84         // for(int i = 0; i < n; ++i){
    85         //     for(int j = 0; j < m; ++j)
    86         //         cout << jstep[i][j] << '	';
    87         //     cout << endl;
    88         // }
    89         if(ans == -1) cout << "IMPOSSIBLE" << endl;
    90         else cout << ans+1 << endl;
    91     }
    92     return 0;
    93 }
    View Code

    K 搜   开数组记录上一个点的坐标

     1 #include <map>
     2 #include <set>
     3 #include <queue>
     4 #include <deque>
     5 #include <cmath>
     6 #include <stack>
     7 #include <string>
     8 #include <vector>
     9 #include <cstdio>
    10 #include <cstdlib>
    11 #include <cstring>
    12 #include <utility>
    13 #include <iostream>
    14 #include <algorithm>
    15 using namespace std;
    16 struct point{
    17     int x, y;
    18 };
    19 int maze[5][5];
    20 point state[5][5];
    21 const int cx[] = {0, 0, 1, -1};
    22 const int cy[] = {1, -1, 0, 0};
    23 int main(){
    24     ios::sync_with_stdio(false);
    25     memset(state, 0, sizeof(state));
    26     for(int i = 0; i < 5; ++i)
    27         for(int j = 0; j < 5; ++j)
    28             cin >> maze[i][j];
    29     queue<point> q;
    30     q.push({0, 0});
    31     maze[0][0] = 1;
    32     bool flag = false;
    33     while(!q.empty()){
    34         point k = q.front();
    35         q.pop();
    36         for(int i = 0; i < 4; ++i){
    37             int x = k.x + cx[i], y = k.y + cy[i];
    38             if(x < 0 || x > 4 || y < 0 || y > 4 || maze[x][y]) continue;
    39             q.push({x, y});
    40             maze[x][y] = 1;
    41             state[x][y] = k;
    42             if(x == 4 && y == 4){
    43                 flag = true;
    44                 break;
    45             }
    46         }
    47         if(flag) break;
    48     }
    49     point k = {4, 4};
    50     stack<point> s;
    51     while(!(k.x == 0 && k.y == 0)){
    52         s.push(k);
    53         k = state[k.x][k.y];
    54     }
    55     s.push(point{0, 0});
    56     while(!s.empty()){
    57         cout << "(" << s.top().x << ", " << s.top().y << ")" << endl;
    58         s.pop();
    59     }
    60     return 0;
    61 }
    View Code

    L 数水坑类的    8个方向

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 using namespace std;
     5 int ans;
     6 char maze[120][120];
     7 const int cx[] = {0, 0, 1, 1, 1, -1, -1, -1};
     8 const int cy[] = {1, -1, 1, -1, 0, 1, 0, -1};
     9 void dfs(int x, int y){
    10     maze[x][y] = '*';
    11     for(int i = 0; i < 8; ++i){
    12         int nx = x + cx[i], ny = y + cy[i];
    13         if(maze[nx][ny] == '@') dfs(nx, ny);
    14     }
    15 }
    16 int main(){
    17     ios::sync_with_stdio(false);
    18     int m, n;
    19     while(cin >> m >> n){
    20         if(m == 0 && n == 0) break;
    21         ans = 0;
    22         for(int i = 0; i < m; ++i){
    23             cin.get();
    24             for(int j = 0; j < n; ++j)
    25                 cin >> maze[i][j];
    26         }
    27         for(int i = 0; i < m; ++i){
    28             for(int j = 0; j < n; ++j){
    29                 if(maze[i][j] == '@'){
    30                     ++ans;
    31                     dfs(i, j);
    32                 }
    33             }
    34         }
    35         cout << ans << endl;
    36     }
    37     return 0;
    38 }
    View Code

    M 可乐.....改了好久蜜汁哇    果断重写   简直恶心

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 //#define print() cout<<ts<<" "<<tn<<" "<<tm<<endl;
      4 
      5 struct state{
      6     int s, n, m;
      7     state(int ss = 0, int nn = 0, int mm = 0): s(ss), n(nn), m(mm) {}
      8 };
      9 int s, n, m;
     10 queue<state> q;
     11 const int MAXN = 111;
     12 int step[MAXN][MAXN][MAXN];
     13 
     14 int main(){
     15     while(cin >> s >> n >> m){
     16         if(s == 0 && n == 0 && m == 0) break;
     17         if(s & 1) cout << "NO" << endl;
     18         else{
     19             while(!q.empty()) q.pop();
     20             memset(step, -1, sizeof(step));
     21             int ans = -1;
     22             q.push(state(s, 0, 0));
     23             step[s][0][0] = 0;
     24             while(!q.empty()){
     25                 state p = q.front();
     26                 q.pop();
     27                 int ss = p.s, nn = p.n, mm = p.m;
     28                 if((ss == s/2 && nn == s/2) || (ss == s/2 && mm == s/2) || (nn == s/2 && mm == s/2)){
     29                     ans = step[ss][nn][mm];
     30                     break;
     31                 }
     32                 state tmp;
     33                 //s -> n || s -> m
     34                 if(ss){
     35                     //s -> n
     36                     if(ss > n - nn){
     37                         tmp.s = ss - (n - nn);
     38                         tmp.n = n;
     39                         tmp.m = mm;
     40                     }
     41                     else{
     42                         tmp.s = 0;
     43                         tmp.n = nn + ss;
     44                         tmp.m = mm;
     45                     }
     46                     if(step[tmp.s][tmp.n][tmp.m] == -1){
     47                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
     48                         q.push(tmp);
     49                     }
     50                     //ss -> m
     51                     if(ss > m - mm){
     52                         tmp.s = ss - (m - mm);
     53                         tmp.m = m;
     54                         tmp.n = nn;
     55                     }
     56                     else{
     57                         tmp.s = 0;
     58                         tmp.m = mm + ss;
     59                         tmp.n = nn;
     60                     }    
     61                     if(step[tmp.s][tmp.n][tmp.m] == -1){
     62                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
     63                         q.push(tmp);
     64                     }
     65                 }
     66                 //n -> s || n -> m
     67                 if(nn){
     68                     //n -> s
     69                     if(nn > s - ss){
     70                         tmp.n  = nn - (s - ss);
     71                         tmp.s = s;
     72                         tmp.m = mm;
     73                     }
     74                     else{
     75                         tmp.n = 0;
     76                         tmp.s = ss + nn;
     77                         tmp.m = mm;
     78                     }
     79                     if(step[tmp.s][tmp.n][tmp.m] == -1){
     80                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
     81                         q.push(tmp);
     82                     }
     83                     //n -> m
     84                     if(nn > m - mm){
     85                         tmp.n  = nn - (m - mm);
     86                         tmp.m = m;
     87                         tmp.s = ss;
     88                     }
     89                     else{
     90                         tmp.n = 0;
     91                         tmp.m = mm + nn;
     92                         tmp.s = ss;
     93                     }
     94                     if(step[tmp.s][tmp.n][tmp.m] == -1){
     95                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
     96                         q.push(tmp);
     97                     }
     98                 }
     99                 //m -> n || m -> s
    100                 if(mm){
    101                     //m -> n
    102                     if(mm > n - nn){
    103                         tmp.m = mm - (n - nn);
    104                         tmp.n = n;
    105                         tmp.s = ss;
    106                     }
    107                     else{
    108                         tmp.m = 0;
    109                         tmp.n = nn + mm;
    110                         tmp.s = ss;
    111                     }
    112                     if(step[tmp.s][tmp.n][tmp.m] == -1){
    113                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
    114                         q.push(tmp);
    115                     }
    116                     //m -> s
    117                     if(mm > s - ss){
    118                         tmp.m = mm - (s - ss);
    119                         tmp.s = s;
    120                         tmp.n = nn;
    121                     }
    122                     else{
    123                         tmp.m = 0;
    124                         tmp.s = mm + ss;
    125                         tmp.n = nn;
    126                     }
    127                     if(step[tmp.s][tmp.n][tmp.m] == -1){
    128                         step[tmp.s][tmp.n][tmp.m] = step[ss][nn][mm] + 1;
    129                         q.push(tmp);
    130                     }
    131                 }
    132             }
    133             if(ans == -1) cout << "NO" << endl;
    134             else cout << ans << endl;
    135         }
    136     }
    137     return 0;
    138 }
    View Code

    N 从两个人的位置开始bfs整个图

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <vector>
     6 #include <iostream>
     7 #include <algorithm>
     8 using namespace std;
     9 
    10 struct pos{
    11     int x, y;
    12     pos(int xx, int yy): x(xx), y(yy){};
    13 };
    14 const int MAXN = 222;
    15 char maze[MAXN][MAXN];
    16 const int cx[] = {1, -1, 0, 0};
    17 const int cy[] = {0, 0, 1, -1};
    18 vector<pos> kfc;
    19 queue<pos> qy; int yx, yy, stepy[MAXN][MAXN];
    20 queue<pos> qm; int mx, my, stepm[MAXN][MAXN];
    21 
    22 int main(){
    23     int n, m;
    24     while(cin >> n >> m){
    25         kfc.clear();
    26         for(int i = 0; i < n; ++i){
    27             cin.get();
    28             for(int j = 0; j < m; ++j){
    29                 char ch;
    30                 cin >> ch;
    31                 if(ch == '#') maze[i][j] = ch;
    32                 else{
    33                     if(ch == 'Y'){
    34                         yx = i;
    35                         yy = j;
    36                     }
    37                     if(ch == 'M'){
    38                         mx = i;
    39                         my = j;
    40                     }
    41                     if(ch == '@')
    42                         kfc.push_back(pos(i, j));
    43                     maze[i][j] = '.';
    44                 }
    45             }
    46         }
    47         while(!qy.empty()) qy.pop();
    48         while(!qm.empty()) qm.pop();
    49         memset(stepy, -1, sizeof(stepy));
    50         memset(stepm, -1, sizeof(stepm));
    51         qy.push(pos(yx, yy));
    52         stepy[yx][yy] = 0;
    53         while(!qy.empty()){
    54             int x = qy.front().x, y = qy.front().y;
    55             qy.pop();
    56             for(int i = 0; i < 4; ++i){
    57                 int nx = x + cx[i], ny = y + cy[i];
    58                 if(nx < 0 || n < nx || ny < 0 || m < ny || maze[nx][ny] == '#' || stepy[nx][ny] != -1) continue;
    59                 stepy[nx][ny] = stepy[x][y] + 1;
    60                 qy.push(pos(nx, ny));
    61             }
    62         }
    63         qm.push(pos(mx, my));
    64         stepm[mx][my] = 0;
    65         while(!qm.empty()){
    66             int x = qm.front().x, y = qm.front().y;
    67             qm.pop();
    68             for(int i = 0; i < 4; ++i){
    69                 int nx = x + cx[i], ny = y + cy[i];
    70                 if(nx < 0 || n < nx || ny < 0 || m < ny || maze[nx][ny] == '#' || stepm[nx][ny] != -1) continue;
    71                 stepm[nx][ny] = stepm[x][y] + 1;
    72                 qm.push(pos(nx, ny));
    73             }
    74         }
    75         int ans = 0x7f7f7f7f;
    76         for(vector<pos>::iterator i = kfc.begin(); i != kfc.end(); ++i){
    77             int x = (*i).x, y = (*i).y;
    78             ans = min(ans, stepy[x][y] + stepm[x][y]);
    79         }
    80         cout << ans*11 << endl;
    81     }
    82     return 0;
    83 }
    View Code

    .............................................................................

  • 相关阅读:
    《未来简史》一、主导世界力量的形成与崩塌
    《小岛经济学》九、美岛应对危机——汽油救火
    《小岛经济学》八、金本位的破灭、房地产的泡沫
    《小岛经济学》七、美国的生命线正是我们中国
    《小岛经济学》六、政府手中的魔术棒
    《小岛经济学》五、政府与央行的上帝之手
    《小岛经济学》四、最成功的栽赃——通货紧缩
    《小岛经济学》三、是什么在拉动经济的增长
    11.boolean类型
    10.整形数据类型
  • 原文地址:https://www.cnblogs.com/book-book/p/5376347.html
Copyright © 2020-2023  润新知