zoukankan      html  css  js  c++  java
  • 1260. Shift 2D Grid

    问题:

    给定一个二维数组,

    对二维数组进行以下变化:

    • 按列(头尾循环)向右平移1位
    • 对第一列,按行(头尾循环)向下平移1位。

    对数组做K次以上操作。求得到的新数组。

    Example 1:
    Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
    Output: [[9,1,2],[3,4,5],[6,7,8]]
    
    Example 2:
    Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
    Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
    
    Example 3:
    Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
    Output: [[1,2,3],[4,5,6],[7,8,9]]
     
    
    Constraints:
    m == grid.length
    n == grid[i].length
    1 <= m <= 50
    1 <= n <= 50
    -1000 <= grid[i][j] <= 1000
    0 <= k <= 100
    

    解法:

    列数平移K位,那么原来的第j列,将被移到,(j+K)%列数

    第一列会被平移行数K位,那么原来的第i行第j列的元素,离第一列的距离位:j,那么它会被移动行数为:(i+(j+K)%列数)%行数

    下面代码:列数=n,行数=m

    代码参考:

     1 class Solution {
     2 public:
     3     vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
     4         int m=grid.size(), n=grid[0].size();
     5         int col=k%n;
     6         vector<vector<int>> res(grid);
     7         for(int i=0; i<m; i++){
     8             for(int j=0; j<n; j++){
     9                 res[(i+(j+k)/n)%m][(j+col)%n]=grid[i][j];
    10             }
    11         }
    12         return res;
    13     }
    14 };

    另外一种方法:

    每一个元素[i,j]看作一个数,值为:i*列数+j

    进制为:列数

    上述的移动操作,可以看作是,

    对于每一个值进行+1操作,而到第一列的时候,该进位,刚好也满足+1的操作。

    因此,每一个元素经过K次操作,即为:value=i*列数+j+K

    而最终所处的位置即是:[value/列数][value%列数]

    ⚠️ 注意:由于数组为循环移动,所以整个数组有时以 列数*行数 为一循环。

    因此在得出value的时候,需要 %列数*行数 取模。

    代码参考:

     1 class Solution {
     2 public:
     3     vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
     4         int m=grid.size(), n=grid[0].size();
     5         vector<vector<int>> res(grid);
     6         for(int i=0; i<m; i++){
     7             for(int j=0; j<n; j++){
     8                 int value=(i*n+j+k)%(m*n);
     9                 res[value/n][value%n]=grid[i][j];
    10             }
    11         }
    12         return res;
    13     }
    14 };
  • 相关阅读:
    poj2954
    bzoj1863
    bzoj2002
    bzoj1389
    [POJ3041] Asteroids(最小点覆盖-匈牙利算法)
    [POJ2594] Treasure Exploration(最小路径覆盖-传递闭包 + 匈牙利算法)
    [POJ2446] Chessboard(二分图最大匹配-匈牙利算法)
    [luoguP1266] 速度限制(spfa)
    [luoguP1186] 玛丽卡(spfa)
    [luoguP1027] Car的旅行路线(Floyd)
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13340065.html
Copyright © 2011-2022 走看看