Advertisement
Guest User

b841: 104北二5.骨牌遊戲

a guest
Jul 22nd, 2016
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. #define VISITED -1
  8.  
  9. struct Node
  10. {
  11.     int x;
  12.     int y;
  13.     int level;
  14. };
  15.  
  16. int findPairs( int** mat, int h, int w, int x, int y)
  17. {
  18.     int levelCount[2] = { 0, 0};  // even level and odd level
  19.     int currValue = mat[x][y];
  20.  
  21.     // bfs starts from x, y
  22.     Node n, nbr;
  23.     n = (Node){.x = x, .y = y, .level = 1};
  24.  
  25.     queue<Node> q; // for bfs
  26.     mat[x][y] = VISITED; // mark as visited
  27.     levelCount[1] = 1;
  28.     q.push( n);
  29.  
  30.     while( q.size() != 0)
  31.     {
  32.         n = q.front();
  33.         q.pop();
  34.         // check neighboors
  35.         if( (n.x-1) >= 0 && mat[n.x-1][n.y] == currValue)
  36.         {
  37.             nbr = (Node){.x = n.x-1, .y = n.y, .level = n.level+1};
  38.             q.push(nbr);
  39.             mat[n.x-1][n.y] = VISITED; // mark as visited
  40.             levelCount[nbr.level%2]++;
  41.         }
  42.         if( (n.x+1) < h &&  mat[n.x+1][n.y] == currValue)
  43.         {
  44.             nbr = (Node){.x = n.x+1, .y = n.y, .level = n.level+1};        
  45.             q.push(nbr);
  46.             mat[n.x+1][n.y] = VISITED; // mark as visited
  47.             levelCount[nbr.level%2]++;
  48.         }
  49.         if( (n.y-1) >= 0 &&  mat[n.x][n.y-1] == currValue)
  50.         {
  51.             nbr = (Node){.x = n.x, .y = n.y-1, .level = n.level+1};
  52.             q.push(nbr);
  53.             mat[n.x][n.y-1] = VISITED; // mark as visited
  54.             levelCount[nbr.level%2]++;
  55.         }
  56.         if( (n.y+1) < w && mat[n.x][n.y+1] == currValue)
  57.         {
  58.             nbr = (Node){.x = n.x, .y = n.y+1, .level = n.level+1};
  59.             q.push(nbr);
  60.             mat[n.x][n.y+1] = VISITED; // mark as visited
  61.             levelCount[nbr.level%2]++;
  62.         }
  63.     }
  64.  
  65.     if( levelCount[1] == 0)
  66.         return 0;
  67.     return min( levelCount[0], levelCount[1]);
  68. }
  69.  
  70. int solver(int** mat, int h, int w)
  71. {
  72.     int count = 0;
  73.     for( int i=0; i< h; i++)
  74.     {
  75.         for( int j=0; j< w; j++)
  76.         {
  77.             if( mat[i][j] != VISITED)
  78.             {
  79.                 count += findPairs( mat, h, w, i, j);
  80.             }
  81.         }
  82.     }
  83.     return count;
  84. }
  85.  
  86.  
  87. int main()
  88. {
  89.     int ** mat;
  90.     int w, h;
  91.  
  92.     cin >> h >> w;
  93.  
  94.     mat = new int*[h];
  95.  
  96.     for( int i=0; i< h; i++)
  97.     {
  98.         mat[i] = new int[w];
  99.         for( int j=0; j< w; j++)
  100.         {
  101.             cin >> mat[i][j];
  102.         }
  103.     }
  104.  
  105.     int numPairs = solver( mat, h, w);
  106.  
  107.     cout << numPairs << endl;
  108.  
  109.     for( int i=0; i< h; i++)
  110.     {
  111.         delete [] mat[i];
  112.     }
  113.     delete [] mat;
  114.  
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement