logo

الاستعلامات في المصفوفة

نظرا لعددين صحيحين م ون الذي يصف النظام م * ن من المصفوفة جنبا إلى جنب مع[][] بدءًا مملوء مع الأعداد الصحيحة من 1 إلى م * ن بالتتابع في أ صف الطلب الرئيسي . كما يوجد أ 2d صفيف استفسار[][] تتكون من س الاستعلامات الذي يحتوي على ثلاثة الأعداد الصحيحة في كل مكان أولاً عدد صحيح ر يصف يكتب الاستعلام و التالي عددين صحيحين س و و وصف صف أو عمود يجب أن يكون تعمل . المهمة هي عملية هؤلاء س التلاعب بالاستعلامات جنبا إلى جنب مع[][]. كل استفسار هو أحد الأنواع الثلاثة التالية:

  • [1xy]: مبادلة س ذ و و ذ صفوف من الحصيرة[][].
  • [2xy]: مبادلة س ذ و و ذ أعمدة من الحصيرة[][].
  • [3xy]: طباعة عنصر في س ذ صف و و ذ عمود الحصيرة[][].

أمثلة: 

مدخل: م = 3 ن = 3
الاستعلام[][] = [[1 0 1]
[3 0 0]
[3 1 0]
[2 0 1]
[3 0 0]
[3 1 0]]



الإخراج: 4 1 5 2

توضيح: في البداية المصفوفة هي:
مع[][] = [[1 2 3]
[4 5 6]
[7 8 9]]
العملية الأولى [1 0 1] : نحتاج إلى تبديل الصف 0 والصف 1.
بعد هذه العملية تصبح المصفوفة:
مع[][] =[[4 5 6]
[1 2 3]
[7 8 9]]
بالنسبة للعمليتين التاليتين، يتعين علينا طباعة العناصر في خلايا معينة.
العملية الرابعة [2 0 1]: نحتاج إلى تبديل العمود 0 والعمود 1.
بعد هذه العملية تصبح المصفوفة:
مع[][] =[[5 4 6]
[2 1 3]
[8 7 9]]
بالنسبة للعمليتين التاليتين، يتعين علينا طباعة العناصر في خلايا معينة.

جدول المحتويات

[نهج ساذج] - O(q*n) الزمن وO(m*n) الفضاء

الفكرة هي أن يخلق مصفوفة جنبا إلى جنب مع[][] من النظام م * ن بدءًا مملوء مع الأعداد الصحيحة من 1 إلى م * ن بالتتابع في أ صف الطلب الرئيسي . بالنسبة للاستفسارات النوع 1 و 2 أي. تبديل اجتياز الصف أو العمود المطلوب وتبديل كل عنصر من عناصره. و بالنسبة للاستعلام النوع 3 أي. مطبعة نحن ببساطة نطبع العنصر في الفهرس المحدد.

C++
// C++ Program to perform queries in a matrix. #include    using namespace std; // function to swap rows of the matrix. void swapRows(vector<vector<int>> &mat int r1 int r2) {  for (int i = 0; i < mat[0].size(); i++) {  swap(mat[r1][i] mat[r2][i]);  } } // function to swap columns of the matrix. void swapCols(vector<vector<int>> &mat int c1 int c2) {  for (int i = 0; i < mat.size(); i++) {  swap(mat[i][c1] mat[i][c2]);  } } // function to operate queries. void solveQueries(int m int n vector<vector<int>> &query) {  // create a matrix or order m*n filled with  // values from 1 to m*n.  vector<vector<int>> mat(m vector<int>(n));  for (int i = 0; i < m; i++) {  for (int j = 0; j < n; j++) {  mat[i][j] = (i * n) + j + 1;  }  }  // perform the queries on the matrix.  for (int i = 0; i < query.size(); i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  swapRows(mat query[i][1] query[i][2]);  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  swapCols(mat query[i][1] query[i][2]);  }  // if query is of type 3  // print the value at the given index.  else {  cout << mat[query[i][1]][query[i][2]] << ' ';  }  } } int main() {  int m = 3 n = 3;  vector<vector<int>> query = {{1 0 1}  {3 0 0}  {3 1 0}  {2 0 1}  {3 0 0}  {3 1 0}};  solveQueries(m n query);  return 0; } 
Java
// Java Program to perform queries in a matrix. import java.util.*; class GfG {  // function to swap rows of the matrix.  static void swapRows(int[][] mat int r1 int r2) {  for (int i = 0; i < mat[0].length; i++) {  int temp = mat[r1][i];  mat[r1][i] = mat[r2][i];  mat[r2][i] = temp;  }  }  // function to swap columns of the matrix.  static void swapCols(int[][] mat int c1 int c2) {  for (int i = 0; i < mat.length; i++) {  int temp = mat[i][c1];  mat[i][c1] = mat[i][c2];  mat[i][c2] = temp;  }  }  // function to operate queries.  static void solveQueries(int m int n int[][] query) {  // create a matrix or order m*n filled with  // values from 1 to m*n.  int[][] mat = new int[m][n];  for (int i = 0; i < m; i++) {  for (int j = 0; j < n; j++) {  mat[i][j] = (i * n) + j + 1;  }  }  // perform the queries on the matrix.  for (int i = 0; i < query.length; i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  swapRows(mat query[i][1] query[i][2]);  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  swapCols(mat query[i][1] query[i][2]);  }  // if query is of type 3  // print the value at the given index.  else {  System.out.print(mat[query[i][1]][query[i][2]] + ' ');  }  }  }  public static void main(String[] args) {  int m = 3 n = 3;  int[][] query = {  {1 0 1}  {3 0 0}  {3 1 0}  {2 0 1}  {3 0 0}  {3 1 0}  };  solveQueries(m n query);  } } 
Python
# Python Program to perform queries in a matrix. # function to swap rows of the matrix. def swapRows(mat r1 r2): mat[r1] mat[r2] = mat[r2] mat[r1] # function to swap columns of the matrix. def swapCols(mat c1 c2): for row in mat: row[c1] row[c2] = row[c2] row[c1] # function to operate queries. def solveQueries(m n query): # create a matrix of order m*n filled with # values from 1 to m*n. mat = [[(i * n) + j + 1 for j in range(n)] for i in range(m)] # perform the queries on the matrix. for q in query: # if query is of type 1 # swap the rows. if q[0] == 1: swapRows(mat q[1] q[2]) # if query is of type 2 # swap the columns. elif q[0] == 2: swapCols(mat q[1] q[2]) # if query is of type 3 # print the value at the given index. else: print(mat[q[1]][q[2]] end=' ') if __name__ == '__main__': m n = 3 3 query = [ [1 0 1] [3 0 0] [3 1 0] [2 0 1] [3 0 0] [3 1 0] ] solveQueries(m n query) 
C#
// C# Program to perform queries in a matrix. using System; class GfG {  // function to swap rows of the matrix.  static void SwapRows(int[] mat int r1 int r2) {  for (int i = 0; i < mat.GetLength(1); i++) {  int temp = mat[r1 i];  mat[r1 i] = mat[r2 i];  mat[r2 i] = temp;  }  }  // function to swap columns of the matrix.  static void SwapCols(int[] mat int c1 int c2) {  for (int i = 0; i < mat.GetLength(0); i++) {  int temp = mat[i c1];  mat[i c1] = mat[i c2];  mat[i c2] = temp;  }  }  // function to operate queries.  static void SolveQueries(int m int n int[][] query) {  // create a matrix or order m*n filled with  // values from 1 to m*n.  int[] mat = new int[m n];  for (int i = 0; i < m; i++) {  for (int j = 0; j < n; j++) {  mat[i j] = (i * n) + j + 1;  }  }  // perform the queries on the matrix.  for (int i = 0; i < query.Length; i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  SwapRows(mat query[i][1] query[i][2]);  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  SwapCols(mat query[i][1] query[i][2]);  }  // if query is of type 3  // print the value at the given index.  else {  Console.Write(mat[query[i][1] query[i][2]] + ' ');  }  }  }  static void Main(string[] args) {  int m = 3 n = 3;  int[][] query = {  new int[] { 1 0 1 }  new int[] { 3 0 0 }  new int[] { 3 1 0 }  new int[] { 2 0 1 }  new int[] { 3 0 0 }  new int[] { 3 1 0 }  };  SolveQueries(m n query);  } } 
JavaScript
// JavaScript Program to perform queries in a matrix. // function to swap rows of the matrix. function swapRows(mat r1 r2) {  [mat[r1] mat[r2]] = [mat[r2] mat[r1]]; } // function to swap columns of the matrix. function swapCols(mat c1 c2) {  for (let i = 0; i < mat.length; i++) {  [mat[i][c1] mat[i][c2]] = [mat[i][c2] mat[i][c1]];  } } // function to operate queries. function solveQueries(m n query) {  // create a matrix or order m*n filled with  // values from 1 to m*n.  const mat = Array.from({ length: m } (_ i) =>  Array.from({ length: n } (_ j) => i * n + j + 1)  );  // perform the queries on the matrix.  for (const q of query) {    // if query is of type 1  // swap the rows.  if (q[0] === 1) {  swapRows(mat q[1] q[2]);  }  // if query is of type 2  // swap the columns.  else if (q[0] === 2) {  swapCols(mat q[1] q[2]);  }  // if query is of type 3  // print the value at the given index.  else {  console.log(mat[q[1]][q[2]] + ' ');  }  } } // driver code const m = 3 n = 3; const query = [  [1 0 1]  [3 0 0]  [3 1 0]  [2 0 1]  [3 0 0]  [3 1 0] ]; solveQueries(m n query); 

الإخراج
4 1 5 2 

تعقيد الوقت: O(q*n) مطلوب لتنفيذ استعلامات q من النوع 1 و2.
المساحة المساعدة: O(m*n) المساحة المساعدة المطلوبة لإنشاء المصفوفة جنبا إلى جنب مع[][] من أجل م * ن.

[الاقتراب المتوقع] - O(q) الزمن وO(m + n) الفضاء

ال عنصر في أي موقف حصيرة [س] [ص] في المصفوفة يمكن وصفها بأنها mat[x][y] = (ن*س) + ص + 1 أين ن هو عدد أعمدة . بدلا من تعديل المصفوفة مباشرة يمكننا استخدامها اثنين مساعد صفوف المصفوفات[م] و كولز [ن] . ال صفوف المصفوفة هي تمت تهيئته مع القيم من ل م-1 يمثل مؤشرات الصفوف و كولز المصفوفة هي تمت تهيئته مع القيم من ل ن-1 يمثل مؤشرات الأعمدة.

لمعالجة استعلام النوع 1 الذي يقايض صفوف س و و نحن ببساطة تبديل ال قيم ل الصفوف [x] و الصفوف [ص]. وبالمثل للاستعلام عن النوع 2 الذي يقايض أعمدة س و و نحن تبديل ال قيم ل كولز [x] و كولز [ص] . للاستفسار عن النوع 3 أيّ مطبعة ال قيمة في الموقف (س ص) نحسب الموقف باستخدام الصيغة حصيرة[x][y] = الصفوف[x]*n + cols[y] + 1.

وفيما يلي تنفيذ الفكرة المذكورة أعلاه:

C++
// C++ Program to perform queries in a matrix. #include    using namespace std; // function to operate queries. void solveQueries(int m int n vector<vector<int>> &query) {  // create two arrays rows and cols  // and fill the value from 0 to size-1  vector<int> rows(m) cols(n);  for(int i = 0; i < m; i++) {  rows[i] = i;  }  for(int i = 0; i < n; i++) {  cols[i] = i;  }  // perform the queries on the matrix.  for (int i = 0; i < query.size(); i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  swap(rows[query[i][1]] rows[query[i][2]]);  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  swap(cols[query[i][1]] cols[query[i][2]]);  }  // if query is of type 3  // print the value at the given index.  else {  cout<< (rows[query[i][1]] * n) + cols[query[i][2]] + 1 << ' ';  }  } } int main() {  int m = 3 n = 3;  vector<vector<int>> query = {{1 0 1}  {3 0 0}  {3 1 0}  {2 0 1}  {3 0 0}  {3 1 0}};  solveQueries(m n query);  return 0; } 
Java
// Java Program to perform queries in a matrix. import java.util.*; class GfG {  // function to operate queries.  static void solveQueries(int m int n int[][] query) {  // create two arrays rows and cols  // and fill the value from 0 to size-1  int[] rows = new int[m];  int[] cols = new int[n];  for (int i = 0; i < m; i++) {  rows[i] = i;  }  for (int i = 0; i < n; i++) {  cols[i] = i;  }  // perform the queries on the matrix.  for (int i = 0; i < query.length; i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  int temp = rows[query[i][1]];   rows[query[i][1]] = rows[query[i][2]];  rows[query[i][2]] = temp;  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  int temp = cols[query[i][1]];  cols[query[i][1]] = cols[query[i][2]];  cols[query[i][2]] = temp;  }  // if query is of type 3  // print the value at the given index.  else {  System.out.print((rows[query[i][1]]*n +   cols[query[i][2]] + 1) + ' ');  }  }  }  public static void main(String[] args) {  int m = 3 n = 3;  int[][] query = {  {1 0 1}  {3 0 0}  {3 1 0}  {2 0 1}  {3 0 0}  {3 1 0}  };  solveQueries(m n query);  } } 
Python
# Python Program to perform queries in a matrix. # function to operate queries. def solveQueries(m n query): # create two arrays rows and cols # and fill the value from 0 to size-1 rows = [i for i in range(m)] cols = [i for i in range(n)] # perform the queries on the matrix. for q in query: # if query is of type 1 # swap the rows. if q[0] == 1: rows[q[1]] rows[q[2]] = rows[q[2]] rows[q[1]] # if query is of type 2 # swap the columns. elif q[0] == 2: cols[q[1]] cols[q[2]] = cols[q[2]] cols[q[1]] # if query is of type 3 # print the value at the given index. else: print((rows[q[1]] * n) + cols[q[2]] + 1 end=' ') if __name__ == '__main__': m n = 3 3 query = [ [1 0 1] [3 0 0] [3 1 0] [2 0 1] [3 0 0] [3 1 0] ] solveQueries(m n query) 
C#
// C# Program to perform queries in a matrix. using System; class GfG {  // function to operate queries.  static void SolveQueries(int m int n int[][] query) {  // create two arrays rows and cols  // and fill the value from 0 to size-1  int[] rows = new int[m];  int[] cols = new int[n];  for(int i = 0; i < m; i++) {  rows[i] = i;  }  for(int i = 0; i < n; i++) {  cols[i] = i;  }  // perform the queries on the matrix.  for (int i = 0; i < query.Length; i++) {  // if query is of type 1  // swap the rows.  if (query[i][0] == 1) {  int temp = rows[query[i][1]];   rows[query[i][1]] = rows[query[i][2]];  rows[query[i][2]] = temp;  }  // if query is of type 2  // swap the columns.  else if (query[i][0] == 2) {  int temp = cols[query[i][1]];  cols[query[i][1]] = cols[query[i][2]];  cols[query[i][2]] = temp;  }  // if query is of type 3  // print the value at the given index.  else {  Console.Write((rows[query[i][1]]*n + cols[query[i][2]] + 1) + ' ');  }  }  }  static void Main(string[] args) {  int m = 3 n = 3;  int[][] query = {  new int[] { 1 0 1 }  new int[] { 3 0 0 }  new int[] { 3 1 0 }  new int[] { 2 0 1 }  new int[] { 3 0 0 }  new int[] { 3 1 0 }  };  SolveQueries(m n query);  } } 
JavaScript
// JavaScript Program to perform queries in a matrix. // function to operate queries. function solveQueries(m n query) {  // create two arrays rows and cols  // and fill the value from 0 to size-1  let rows = new Array(m);  let cols = new Array(n);  for (let i = 0; i < m; i++) {  rows[i] = i;  }  for (let i = 0; i < n; i++) {  cols[i] = i;  }  // perform the queries on the matrix.  for (const q of query) {    // if query is of type 1  // swap the rows.  if (q[0] === 1) {  [rows[q[1]] rows[q[2]]] = [rows[q[2]] rows[q[1]]];  }  // if query is of type 2  // swap the columns.  else if (q[0] === 2) {  [cols[q[1]] cols[q[2]]] = [cols[q[2]] cols[q[1]]];  }  // if query is of type 3  // print the value at the given index.  else {  process.stdout.write(((rows[q[1]] * n) + cols[q[2]] + 1) + ' ');  }  } } const m = 3 n = 3; const query = [  [1 0 1]  [3 0 0]  [3 1 0]  [2 0 1]  [3 0 0]  [3 1 0] ]; solveQueries(m n query); 

الإخراج
4 1 5 2 

تعقيد الوقت: O(q) q = عدد الاستعلامات 
المساحة المساعدة: المساحة الإضافية O(m + n) مطلوبة لإنشاء صفيفين.