📜  沿给定方向移动矩阵元素并添加具有相同值的元素

📅  最后修改于: 2022-05-13 01:57:22.878000             🧑  作者: Mango

沿给定方向移动矩阵元素并添加具有相同值的元素

给定一个由整数组成的大小为nxn的矩阵m[ ][ ]并给定一个表示方向的字符“x”。 'x'的取值可以是'u'、'd'、'l'、'r',分别表示Up、Down、Left、Right。任务是将元素移动到给定的方向,使具有相同值的连续元素添加为单个值并移动其余元素。此外,如果给定方向的下一个元素为 0,则移动该元素。
例如 :
考虑 x = 'l' 和矩阵 m[][],
32 3 3
0 0 1
10 10 8
第一行加3,第三行加10,第二行加1,
矩阵将成为
32 6 0
1 0 0
20 8 0
例子 :

Input : x = 'l'
m[][] = { { 32, 3, 3, 3, 3 },
          { 0, 0, 1, 0, 0 },
          { 10, 10, 8, 1, 2},
          { 0, 0, 0, 0, 1},
          { 4, 5, 6, 7, 8 } }
Output :
32 6 6 0 0
1 0 0 0 0
20 8 1 2 0
1 0 0 0 0 0
4 5 6 7 8

Input : x = 'u'
m[][] = { { 10, 3, 32 },
        { 10, 0, 96 },
        { 5, 32, 96 } }
Output :
20 3 32
5 32 192
0 0 0

方法:想法是从行或列的 x 侧向 x'(x 的对面)遍历每一行或列(取决于给定的方向)。例如,如果给定的 x 值是“l”(左),则从左到右开始扫描每一行。在遍历时,通过跳过具有值 0 的元素和连续元素的总和(如果它们具有相等的值)将行或列元素存储在临时一维数组(比如 temp[])中。之后,开始将临时数组 temp[0..k] 从 x 侧(行或列)复制到当前行或列到 x'(x 的对面),并将元素的 reset 填充为 0。
让,x = 'l' 即向左移动。因此,开始将每一行从该行的最左侧索引复制到该行最右侧的索引,并存储在临时数组中,处理忽略 0 并将两个连续元素添加为一个(如果它们具有相同的值)。下面是第 1 行的插图,

现在,对于每个,从最左边的索引到最右边的索引将临时数组复制到当前行。下面是第 1 行的插图,



下面是这种方法的实现:

C++
// C++ code to move matrix elements
// in given direction with add
// element with same value
#include 
using namespace std;
 
#define MAX 50
 
// Function to shift the matrix
// in the given direction
void moveMatrix(char d[], int n,
                int a[MAX][MAX])
{
 
    // For right shift move.
    if (d[0] == 'r') {
 
        // for each row from
        // top to bottom
        for (int i = 0; i < n; i++) {
            vector v, w;
            int j;
 
            // for each element of
            // row from right to left
            for (j = n - 1; j >= 0; j--) {
                // if not 0
                if (a[i][j])
                    v.push_back(a[i][j]);
            }
 
            // for each temporary array
            for (j = 0; j < v.size(); j++) {
                // if two element have same
                // value at consecutive position.
                if (j < v.size() - 1 && v[j] == v[j + 1]) {
                    // insert only one element
                    // as sum of two same element.
                    w.push_back(2 * v[j]);
                    j++;
                }
                else
                    w.push_back(v[j]);
            }
 
            // filling the each row element to 0.
            for (j = 0; j < n; j++)
                a[i][j] = 0;
 
            j = n - 1;
 
            // Copying the temporary
            // array to the current row.
            for (auto it = w.begin();
                 it != w.end(); it++)
                a[i][j--] = *it;
        }
    }
 
    // for left shift move
    else if (d[0] == 'l') {
 
        // for each row
        for (int i = 0; i < n; i++) {
            vector v, w;
            int j;
 
            // for each element of the
            // row from left to right
            for (j = 0; j < n; j++) {
                // if not 0
                if (a[i][j])
                    v.push_back(a[i][j]);
            }
 
            // for each temporary array
            for (j = 0; j < v.size(); j++) {
                // if two element have same
                // value at consecutive position.
                if (j < v.size() - 1 && v[j] == v[j + 1]) {
                    // insert only one element
                    // as sum of two same element.
                    w.push_back(2 * v[j]);
                    j++;
                }
                else
                    w.push_back(v[j]);
            }
 
            // filling the each row element to 0.
            for (j = 0; j < n; j++)
                a[i][j] = 0;
 
            j = 0;
 
            for (auto it = w.begin();
                 it != w.end(); it++)
                a[i][j++] = *it;
        }
    }
 
    // for down shift move.
    else if (d[0] == 'd') {
        // for each column
        for (int i = 0; i < n; i++) {
            vector v, w;
            int j;
 
            // for each element of
            // column from bottom to top
            for (j = n - 1; j >= 0; j--) {
                // if not 0
                if (a[j][i])
                    v.push_back(a[j][i]);
            }
 
            // for each temporary array
            for (j = 0; j < v.size(); j++) {
 
                // if two element have same
                // value at consecutive position.
                if (j < v.size() - 1 && v[j] == v[j + 1]) {
                    // insert only one element
                    // as sum of two same element.
                    w.push_back(2 * v[j]);
                    j++;
                }
                else
                    w.push_back(v[j]);
            }
 
            // filling the each column element to 0.
            for (j = 0; j < n; j++)
                a[j][i] = 0;
 
            j = n - 1;
 
            // Copying the temporary array
            // to the current column
            for (auto it = w.begin();
                 it != w.end(); it++)
                a[j--][i] = *it;
        }
    }
 
    // for up shift move
    else if (d[0] == 'u') {
        // for each column
        for (int i = 0; i < n; i++) {
            vector v, w;
            int j;
 
            // for each element of column
            // from top to bottom
            for (j = 0; j < n; j++) {
                // if not 0
                if (a[j][i])
                    v.push_back(a[j][i]);
            }
 
            // for each temporary array
            for (j = 0; j < v.size(); j++) {
                // if two element have same
                // value at consecutive position.
                if (j < v.size() - 1 && v[j] == v[j + 1]) {
                    // insert only one element
                    // as sum of two same element.
                    w.push_back(2 * v[j]);
                    j++;
                }
                else
                    w.push_back(v[j]);
            }
 
            // filling the each column element to 0.
            for (j = 0; j < n; j++)
                a[j][i] = 0;
 
            j = 0;
 
            // Copying the temporary array
            // to the current column
            for (auto it = w.begin();
                 it != w.end(); it++)
                a[j++][i] = *it;
        }
    }
}
 
// Driven Program
int main()
{
    char d[2] = "l";
    int n = 5;
    int a[MAX][MAX] = { { 32, 3, 3, 3, 3 },
                        { 0, 0, 1, 0, 0 },
                        { 10, 10, 8, 1, 2 },
                        { 0, 0, 0, 0, 1 },
                        { 4, 5, 6, 7, 8 } };
 
    moveMatrix(d, n, a);
 
    // Printing the final array
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
 
        cout << endl;
    }
 
    return 0;
}


Java
// Java code to move matrix
// elements in given direction
// with add element with same value
import java.io.*;
import java.util.*;
 
class GFG {
    // Function to shift the matrix
    // in the given direction
    static void moveMatrix(char d,
                           int n,
                           int a[][])
    {
 
        // For right shift move.
        if (d == 'r') {
 
            // for each row from
            // top to bottom
            for (int i = 0; i < n; i++) {
                ArrayList v = new ArrayList();
                ArrayList w = new ArrayList();
                int j;
 
                // for each element of
                // row from right to left
                for (j = n - 1; j >= 0; j--) {
                    // if not 0
                    if (a[i][j] != 0)
                        v.add(a[i][j]);
                }
 
                // for each temporary array
                for (j = 0; j < v.size(); j++) {
                    // if two element have
                    // same value at
                    // consecutive position.
                    if (j < v.size() - 1 && v.get(j) == v.get(j + 1)) {
                        // insert only one element
                        // as sum of two same element.
                        w.add(2 * v.get(j));
                        j++;
                    }
                    else
                        w.add(v.get(j));
                }
 
                // filling the each
                // row element to 0.
                for (j = 0; j < n; j++)
                    a[i][j] = 0;
 
                j = n - 1;
 
                // Copying the temporary
                // array to the current row.
                for (int it = 0; it < w.size(); it++)
                    a[i][j--] = w.get(it);
            }
        }
 
        // for left shift move
        else if (d == 'l') {
 
            // for each row
            for (int i = 0; i < n; i++) {
                ArrayList v = new ArrayList();
                ArrayList w = new ArrayList();
                int j;
 
                // for each element of the
                // row from left to right
                for (j = 0; j < n; j++) {
                    // if not 0
                    if (a[i][j] != 0)
                        v.add(a[i][j]);
                }
 
                // for each temporary array
                for (j = 0; j < v.size(); j++) {
                    // if two element have
                    // same value at
                    // consecutive position.
                    if (j < v.size() - 1 && v.get(j) == v.get(j + 1)) {
                        // insert only one
                        // element as sum
                        // of two same element.
                        w.add(2 * v.get(j));
                        j++;
                    }
                    else
                        w.add(v.get(j));
                }
 
                // filling the each
                // row element to 0.
                for (j = 0; j < n; j++)
                    a[i][j] = 0;
 
                j = 0;
 
                for (int it = 0; it < w.size(); it++)
                    a[i][j++] = w.get(it);
            }
        }
 
        // for down shift move.
        else if (d == 'd') {
            // for each column
            for (int i = 0; i < n; i++) {
                ArrayList v = new ArrayList();
                ArrayList w = new ArrayList();
                int j;
 
                // for each element of
                // column from bottom to top
                for (j = n - 1; j >= 0; j--) {
                    // if not 0
                    if (a[j][i] != 0)
                        v.add(a[j][i]);
                }
 
                // for each temporary array
                for (j = 0; j < v.size(); j++) {
 
                    // if two element have
                    // same value at consecutive
                    // position.
                    if (j < v.size() - 1 && v.get(j) == v.get(j + 1)) {
                        // insert only one element
                        // as sum of two same element.
                        w.add(2 * v.get(j));
                        j++;
                    }
                    else
                        w.add(v.get(j));
                }
 
                // filling the each
                // column element to 0.
                for (j = 0; j < n; j++)
                    a[j][i] = 0;
 
                j = n - 1;
 
                // Copying the temporary array
                // to the current column
                for (int it = 0; it < w.size(); it++)
                    a[j--][i] = w.get(it);
            }
        }
 
        // for up shift move
        else if (d == 'u') {
            // for each column
            for (int i = 0; i < n; i++) {
                ArrayList v = new ArrayList();
                ArrayList w = new ArrayList();
                int j;
 
                // for each element of column
                // from top to bottom
                for (j = 0; j < n; j++) {
                    // if not 0
                    if (a[j][i] != 0)
                        v.add(a[j][i]);
                }
 
                // for each temporary array
                for (j = 0; j < v.size(); j++) {
                    // if two element have
                    // same value at
                    // consecutive position.
                    if (j < v.size() - 1 && v.get(j) == v.get(j + 1)) {
                        // insert only one element
                        // as sum of two same element.
                        w.add(2 * v.get(j));
                        j++;
                    }
                    else
                        w.add(v.get(j));
                }
 
                // filling the each
                // column element to 0.
                for (j = 0; j < n; j++)
                    a[j][i] = 0;
 
                j = 0;
 
                // Copying the temporary
                // array to the current
                // column
                for (int it = 0; it < w.size(); it++)
                    a[j++][i] = w.get(it);
            }
        }
    }
 
    // Driver Code
    public static void main(String args[])
    {
        char d = 'l';
        int n = 5;
        int a[][] = { { 32, 3, 3, 3, 3 },
                      { 0, 0, 1, 0, 0 },
                      { 10, 10, 8, 1, 2 },
                      { 0, 0, 0, 0, 1 },
                      { 4, 5, 6, 7, 8 } };
 
        moveMatrix(d, n, a);
 
        // Printing the
        // final array
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
                System.out.print(a[i][j] + " ");
 
            System.out.println();
        }
    }
}
 
// This code is contributed by
// Manish Shaw(manishshaw1)


Python3
# Python3 code to move matrix elements
# in given direction with add
# element with same value
MAX = 50
 
# Function to shift the matrix
# in the given direction
def moveMatrix(d, n, a):
 
    # For right shift move.
    if (d[0] == 'r'):
 
        # For each row from
        # top to bottom
        for i in range(n):
            v = []
            w = []
 
            # For each element of
            # row from right to left
            for j in range(n - 1, -1, -1):
                 
                # if not 0
                if (a[i][j]):
                    v.append(a[i][j])
 
            # For each temporary array
            j = 0
            while (j < len(v)):
                 
                # If two element have same
                # value at consecutive position.
                if (j < len(v) - 1 and
                   v[j] == v[j + 1]):
                     
                    # Insert only one element
                    # as sum of two same element.
                    w.append(2 * v[j])
                    j += 1
                 
                else:
                    w.append(v[j])
                     
                j += 1
 
            # Filling the each row element to 0.
            for j in range(n):
                a[i][j] = 0
 
            j = n - 1
 
            # Copying the temporary
            # array to the current row.
            for it in w:
                a[i][j] = it
                j -= 1
 
    # For left shift move
    elif (d[0] == 'l'):
 
        # For each row
        for i in range(n):
            v = []
            w = []
 
            # For each element of the
            # row from left to right
            for j in range(n):
                 
                # If not 0
                if (a[i][j]):
                    v.append(a[i][j])
 
            # For each temporary array
            j = 0
            while(j < len(v)):
                 
                # If two element have same
                # value at consecutive position.
                if (j < len(v) - 1 and
                   v[j] == v[j + 1]):
                     
                    # Insert only one element
                    # as sum of two same element.
                    w.append(2 * v[j])
                    j += 1
                 
                else:
                    w.append(v[j])
                     
                j += 1
 
            # Filling the each row element to 0.
            for j in range(n):
                a[i][j] = 0
 
            j = 0
 
            for it in w:
                a[i][j] = it
                j += 1
 
    # For down shift move.
    elif (d[0] == 'd'):
         
        # For each column
        for i in range(n):
            v = []
            w = []
 
            # For each element of
            # column from bottom to top
            for j in range(n - 1, -1, -1):
                 
                # If not 0
                if (a[j][i]):
                    v.append(a[j][i])
 
            # For each temporary array
            j = 0
            while(j < len(v)):
 
                # If two element have same
                # value at consecutive position.
                if (j 


C#
// C# code to move matrix elements
// in given direction with add
// element with same value
using System;
using System.Collections.Generic;
 
class GFG {
    // Function to shift the matrix
    // in the given direction
    static void moveMatrix(char d, int n,
                           int[, ] a)
    {
 
        // For right shift move.
        if (d == 'r') {
 
            // for each row from
            // top to bottom
            for (int i = 0; i < n; i++) {
                List v = new List();
                List w = new List();
                int j;
 
                // for each element of
                // row from right to left
                for (j = n - 1; j >= 0; j--) {
                    // if not 0
                    if (a[i, j] != 0)
                        v.Add(a[i, j]);
                }
 
                // for each temporary array
                for (j = 0; j < v.Count; j++) {
                    // if two element have
                    // same value at
                    // consecutive position.
                    if (j < v.Count - 1 && v[j] == v[j + 1]) {
                        // insert only one element
                        // as sum of two same element.
                        w.Add(2 * v[j]);
                        j++;
                    }
                    else
                        w.Add(v[j]);
                }
 
                // filling the each
                // row element to 0.
                for (j = 0; j < n; j++)
                    a[i, j] = 0;
 
                j = n - 1;
 
                // Copying the temporary
                // array to the current row.
                for (int it = 0; it < w.Count; it++)
                    a[i, j--] = w[it];
            }
        }
 
        // for left shift move
        else if (d == 'l') {
 
            // for each row
            for (int i = 0; i < n; i++) {
                List v = new List();
                List w = new List();
                int j;
 
                // for each element of the
                // row from left to right
                for (j = 0; j < n; j++) {
                    // if not 0
                    if (a[i, j] != 0)
                        v.Add(a[i, j]);
                }
 
                // for each temporary array
                for (j = 0; j < v.Count; j++) {
                    // if two element have
                    // same value at
                    // consecutive position.
                    if (j < v.Count - 1 && v[j] == v[j + 1]) {
                        // insert only one element
                        // as sum of two same element.
                        w.Add(2 * v[j]);
                        j++;
                    }
                    else
                        w.Add(v[j]);
                }
 
                // filling the each
                // row element to 0.
                for (j = 0; j < n; j++)
                    a[i, j] = 0;
 
                j = 0;
 
                for (int it = 0; it < w.Count; it++)
                    a[i, j++] = w[it];
            }
        }
 
        // for down shift move.
        else if (d == 'd') {
            // for each column
            for (int i = 0; i < n; i++) {
                List v = new List();
                List w = new List();
                int j;
 
                // for each element of
                // column from bottom to top
                for (j = n - 1; j >= 0; j--) {
                    // if not 0
                    if (a[j, i] != 0)
                        v.Add(a[j, i]);
                }
 
                // for each temporary array
                for (j = 0; j < v.Count; j++) {
 
                    // if two element have same
                    // value at consecutive position.
                    if (j < v.Count - 1 && v[j] == v[j + 1]) {
                        // insert only one element
                        // as sum of two same element.
                        w.Add(2 * v[j]);
                        j++;
                    }
                    else
                        w.Add(v[j]);
                }
 
                // filling the each
                // column element to 0.
                for (j = 0; j < n; j++)
                    a[j, i] = 0;
 
                j = n - 1;
 
                // Copying the temporary array
                // to the current column
                for (int it = 0; it < w.Count; it++)
                    a[j--, i] = w[it];
            }
        }
 
        // for up shift move
        else if (d == 'u') {
            // for each column
            for (int i = 0; i < n; i++) {
                List v = new List();
                List w = new List();
                int j;
 
                // for each element of column
                // from top to bottom
                for (j = 0; j < n; j++) {
                    // if not 0
                    if (a[j, i] != 0)
                        v.Add(a[j, i]);
                }
 
                // for each temporary array
                for (j = 0; j < v.Count; j++) {
                    // if two element have same
                    // value at consecutive position.
                    if (j < v.Count - 1 && v[j] == v[j + 1]) {
                        // insert only one element
                        // as sum of two same element.
                        w.Add(2 * v[j]);
                        j++;
                    }
                    else
                        w.Add(v[j]);
                }
 
                // filling the each
                // column element to 0.
                for (j = 0; j < n; j++)
                    a[j, i] = 0;
 
                j = 0;
 
                // Copying the temporary array
                // to the current column
 
                for (int it = 0; it < w.Count; it++)
                    a[j++, i] = w[it];
            }
        }
    }
 
    // Driven Code
    static void Main()
    {
        char d = 'l';
        int n = 5;
        int[, ] a = new int[, ] { { 32, 3, 3, 3, 3 },
                                  { 0, 0, 1, 0, 0 },
                                  { 10, 10, 8, 1, 2 },
                                  { 0, 0, 0, 0, 1 },
                                  { 4, 5, 6, 7, 8 } };
 
        moveMatrix(d, n, a);
 
        // Printing the final array
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
                Console.Write(a[i, j] + " ");
 
            Console.WriteLine();
        }
    }
}
// This code is contributed by
// Manish Shaw(manishshaw1)


PHP
= 0; $j--)
            {
                // if not 0
                if ($a[$i][$j])
                    array_push($v, $a[$i][$j]);
            }
 
            // for each temporary array
            for ($j = 0; $j < count($v); $j++)
            {
                // if two element have same
                // value at consecutive position.
                if ($j < count($v) - 1 &&
                    $v[$j] == $v[$j + 1])
                {
                    // insert only one element
                    // as sum of two same element.
                    array_push($w, 2 * $v[$j]);
                    $j++;
                }
                else
                    array_push($w, $v[$j]);
            }
 
            // filling the each
            // row element to 0.
            for ($j = 0; $j < $n; $j++)
                $a[$i][$j] = 0;
 
            $j = $n - 1;
 
            // Copying the temporary
            // array to the current row.
            for ($it = 0; $it != count($w); $it++)
                    $a[$i][$j--] = $w[$it];
        }
    }
 
    // for left shift move
    else if ($d[0] == 'l')
    {
        // for each row
        for ($i = 0; $i < $n; $i++)
        {
            $v = array(); $w = array();
            $j = 0;
 
            // for each element of the
            // row from left to right
            for ($j = 0; $j < $n; $j++)
            {
                // if not 0
                if ($a[$i][$j])
                    array_push($v,
                               $a[$i][$j]);
            }
 
            // for each temporary array
            for ($j = 0; $j < count($v); $j++)
            {
                // if two element have
                // same value at consecutive
                // position.
                if ($j < count($v) - 1 &&
                    $v[$j] == $v[$j + 1])
                {
                    // insert only one element
                    // as sum of two same element.
                    array_push($w, 2 * $v[$j]);
                    $j++;
                }
                else
                    array_push($w, $v[$j]);
            }
 
            // filling the each
            // row element to 0.
            for ($j = 0; $j < $n; $j++)
                $a[$i][$j] = 0;
 
            $j = 0;
 
            for ($it = 0; $it != count($w); $it++)
                    $a[$i][$j++] = $w[$it];
        }
    }
 
    // for down shift move.
    else if ($d[0] == 'd')
    {
        // for each column
        for ($i = 0; $i < $n; $i++)
        {
            $v = array(); $w = array();
            $j = 0;
 
            // for each element
            // of column from
            // bottom to top
            for ($j = $n - 1; $j >= 0; $j--)
            {
                // if not 0
                if ($a[$j][$i])
                    array_push($v, $a[$j][$i]);
            }
 
            // for each temporary array
            for ($j = 0; $j < count($v); $j++)
            {
                 
                // if two element have
                // same value at
                // consecutive position.
                if ($j < count($v) - 1 &&
                    $v[$j] == $v[$j + 1])
                {
                    // insert only one element
                    // as sum of two same element.
                    array_push($w, 2 * $v[$j]);
                    $j++;
                }
                else
                    array_push($w, $v[$j]);
            }
 
            // filling the each
            // column element to 0.
            for ($j = 0; $j < $n; $j++)
                $a[$j][$i] = 0;
 
            $j = $n - 1;
 
            // Copying the temporary array
            // to the current column
            for ($it = 0; $it != count($w); $it++)
                    $a[$j--][$i] = $w[$it];
        }
    }
 
    // for up shift move
    else if ($d[0] == 'u')
    {
        // for each column
        for ($i = 0; $i < $n; $i++)
        {
            $v = array(); $w = array();
            $j = 0;
 
            // for each element of column
            // from top to bottom
            for ($j = 0; $j < $n; $j++)
            {
                // if not 0
                if ($a[$j][$i])
                    array_push($v,
                               $a[$j][$i]);
            }
 
            // for each temporary array
            for ($j = 0; $j < count($v); $j++)
            {
                // if two element have same
                // value at consecutive position.
                if ($j < count($v) - 1 &&
                    $v[$j] == $v[$j + 1])
                {
                    // insert only one element
                    // as sum of two same element.
                    array_push($w, 2 * $v[$j]);
                    $j++;
                }
                else
                    array_push($w, $v[$j]);
            }
 
            // filling the each
            // column element to 0.
            for ($j = 0; $j < $n; $j++)
                $a[$j][$i] = 0;
 
            $j = 0;
 
            // Copying the temporary array
            // to the current column
            for ($it = 0; $it != count($w); $it++)
                    $a[$j++][$i] = $w[$it];
        }
    }
}
 
// Driven Code
$d = array("l");
$n = 5;
$a = array( array(32, 3, 3, 3, 3),
            array(0, 0, 1, 0, 0),
            array(10, 10, 8, 1, 2),
            array(0, 0, 0, 0, 1),
            array(4, 5, 6, 7, 8));
 
moveMatrix($d, $n, $a);
 
// Printing the final array
for ($i = 0; $i < $n; $i++)
{
    for ($j = 0; $j < $n; $j++)
        echo ($a[$i][$j]." ");
 
    echo ("\n");
}
 
// This code is contributed
// by Manish Shaw(manishshaw1)
?>


Javascript


输出:
32 6 6 0 0 
1 0 0 0 0 
20 8 1 2 0 
1 0 0 0 0 
4 5 6 7 8

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程