• UVa810


    这道题不想说什么了,如果不能想出更好的解决方法的话,打表是个好东西!

    // UVa 810
    #include <cstdio>
    #include <iostream>
    #include <cstring> 
    #include <string> 
    #include <vector> 
    #include <set> 
    using namespace std; 
    
    const int maxn = 10 + 5; 
    
    int pic[7][7]; 
    
    void init() {
        pic[1][2] = 4; pic[1][3] = 2; pic[1][4] = 5; pic[1][5] = 3;
        pic[2][1] = 3; pic[2][3] = 6; pic[2][4] = 1; pic[2][6] = 4;
        pic[3][1] = 5; pic[3][2] = 1; pic[3][5] = 6; pic[3][6] = 2;
        pic[4][1] = 2; pic[4][2] = 6; pic[4][5] = 1; pic[4][6] = 5;
        pic[5][1] = 4; pic[5][3] = 1; pic[5][4] = 6; pic[5][6] = 3;
        pic[6][2] = 3; pic[6][3] = 5; pic[6][4] = 2; pic[6][5] = 4;
    }
    
    int n, m, a, b, t, f;
    int G[maxn][maxn];
    
    struct Node {
      int x, y, top, face, root;  
      Node(int x=0, int y=0, int top=0, int face=0, int root=0) : 
        x(x), y(y), top(top), face(face), root(root) {}
      bool operator < (Node b) const {
        if (x != b.x) return x < b.x;
        if (y != b.y) return y < b.y;
        if (top != b.top) return top < b.top;
        return face < b.face;  
      }
      bool isVis() const {
        return x >= 1 && x <= n && y >= 1 && y <= m && G[x][y] != 0;     
      }
    };
    
    int cnt;
    set<Node> Set;
    vector<Node> Ans; 
    
    void findnode(Node u, int rem) {
      int x1, y1, t, f, l;
      x1 = u.x; y1 = u.y; t = u.top; f = u.face;      
      l = pic[t][f]; 
      Node a1(x1, y1-1, 7-l, f, rem);
      if (a1.isVis() && !Set.count(a1) && (G[x1][y1-1] == -1 || G[x1][y1-1] == t)) {
        Set.insert(a1);
        Ans.push_back(a1);
      }
      Node a2(x1, y1+1, l, f, rem); 
      if (a2.isVis() && !Set.count(a2) && (G[x1][y1+1] == -1 || G[x1][y1+1] == t)) {
        Set.insert(a2);
        Ans.push_back(a2);     
      }
      Node a3(x1-1, y1, f, 7-t, rem); 
      if (a3.isVis() && !Set.count(a3) && (G[x1-1][y1] == -1 || G[x1-1][y1] == t)) {
        Set.insert(a3);
        Ans.push_back(a3);     
      }
      Node a4(x1+1, y1, 7-f, t, rem);
      if (a4.isVis() && !Set.count(a4) && (G[x1+1][y1] == -1 || G[x1+1][y1] == t)) {
        Set.insert(a4);
        Ans.push_back(a4);    
      }
    }
    
    bool bfs() {    
      Node v(a, b, t, f, -1);
      Ans.push_back(v); 
      while (cnt < Ans.size()) {
        Node u = Ans[cnt++]; 
    //    cout << u.x << " " << u.y << " " << u.top << " " << u.face << endl; 
        if (u.x == a && u.y == b && cnt-1) return true;  
        findnode(u, cnt-1);
      }
      return false; 
    }
    
    int count, flag; 
    
    void DG(int num) {
      if (Ans[num].root != -1) DG(Ans[num].root);
      ++count;
      count %= 10; 
      if (flag) 
        printf(",");
      else { 
        printf("  ");
        flag = 1;
      }
      if (count == 0) {
        printf("
    ");
        printf("  "); 
        count = 1; 
      }
      printf("(%d,%d)", Ans[num].x, Ans[num].y);     
    }
    
    int main() { 
      init();
      string str;
      while (cin >> str && str != "END") {
        cout << str << "
    "; 
        cin >> n >> m >> a >> b >> t >> f;  
        for (int i = 1; i <= n; ++i)
          for (int j = 1; j <= m; ++j) 
            cin >> G[i][j];
        cnt = 0;
        Set.clear(); 
        Ans.clear();
        if (bfs()) {
          count = flag = 0;
          DG(cnt-1);
          printf("
    "); 
        }
        else 
          printf("  No Solution Possible
    "); 
      }
      return 0;
    }
  • 相关阅读:
    营山护照办理
    非北京人员 办理护照
    护照填写注意事项
    美国会议签证——我是正当理由去美国,我能支付(或有人为我支付)我在美国期间的所有费用,办完事我肯定回来, 邀请信,行程表这些材料齐全即可
    urllib2使用2
    python 异常
    python urllib和urllib2 区别
    python类继承
    gcc编译4个阶段
    Vim中如何全选并复制?
  • 原文地址:https://www.cnblogs.com/yifeiWa/p/10981419.html
Copyright © 2020-2023  润新知