נתון שניים מטריצות א ו ב של גודל n*m . המשימה היא למצוא את הדרוש מספר שלבי הטרנספורמציה כך ששתי המטריצות יהיו שוות. הֶדפֵּס -1 אם זה לא אפשרי.
ה טרנספורמציה השלב הוא כדלקמן:
- בחר כל מטריצה אחת מתוך שתי מטריצות.
- בחר באחת מהן שורה/עמודה של המטריצה שנבחרה.
- הגדל כל רכיב של הבחירה שורה/עמודה עד 1.
דוגמאות:
קֶלֶט:
a[][] = [[1 1]
[1 1]]גיל פיט דיווידסוןב[][] = [[1 2]
[3 4]]תְפוּקָה : 3
הֶסבֵּר :
[[1 1] -> [[1 2] -> [[1 2] -> [[1 2]
[1 1]] [1 2]] [2 3]] [3 4]]
קֶלֶט :
a[][] = [[1 1]
[1 0]]ב[][] = [[1 2]
[3 4]]לוגו javaתְפוּקָה : -1
הֶסבֵּר : שום טרנספורמציה לא תהפוך את a ו-b לשווים.
גִישָׁה:
הרעיון הוא זה עולה כל שורה/עמודה פנימה מטריצה א שווה ערך ל מוריד אותה שורה/עמודה פנימה מטריצה ב .
זה אומר שבמקום לעקוב אחר שתי המטריצות נוכל לעבוד עם ההבדל שלהן (א[i][j] - ב[i][j]). כאשר אנו מגדילים שורה ב' א' כל הרכיבים בשורה זו גדלים ב-1, זהה לכל הרכיבים באותה שורה של מטריצת ההפרשים גדלים ב-1. באופן דומה כאשר אנו מגדילים עמודה ב-' א' זה שווה ערך להגדלת כל האלמנטים בעמודה זו של מטריצת ההפרש ב-1.
זה מאפשר לנו להפוך את הבעיה לעבודה עם מטריצה אחת בלבד.
קבע אם קיים פתרון כלשהו או לא:
שיטת java שווה
לאחר יצירת ה מטריצת הבדלים עבור כל תא a[i][j] (לא כולל השורה הראשונה והעמודה הראשונה) אנו בודקים אם
a[i][j] - a[i][0] - a[0][j] + a[0][0] = 0.
אם המשוואה הזו לא מתקיימת עבור אף תא נוכל מיד להסיק שאין פתרון.
למה זה עובד?
תחשוב איך שורה ועמודה פעולות משפיעות על כל תא: כאשר אנו מבצעים x פעולות בשורה אֲנִי ו ו פעולות בעמודה י a[i][j] משתנה לפי (x + y) a[i][0] שינויים לפי x (פעולות שורה בלבד) a[0][j] שינויים לפי y (פעולות עמודה בלבד) ו-a[0][0] מושפע על ידי לא שורה i ולא עמודה j פעולות. לָכֵן (x + y) - x - y + 0 = 0 חייב להחזיק עבור כל פתרון תקף. אם המשוואה הזו לא מתקיימת עבור אף תא, זה אומר ששום רצף של פעולות שורה ועמודה לא יכול להפוך מטריצה אחת לאחרת.
חשב את מספר התמורות הנדרשות:
C++כדי לחשב את מספר הטרנספורמציות הנדרשות עלינו רק להסתכל על שורה ראשונה ו עמודה ראשונה כִּי:
- קודם כל נסכם |a[i][0]| עבור all i (כל רכיב עמודה ראשונה) כי זה מייצג כמה פעולות שורה אנחנו צריכים. עבור כל שורה i אנחנו צריכים |a[i][0]| פעולות כדי להפוך את רכיב השורה לאפס.
- ואז נסכם |a[0][j] - a[0][0]| עבור כל j (כל אלמנט בשורה הראשונה פחות אלמנט ראשון) מכיוון שזה מייצג פעולות עמודה נוספות הדרושות. אנו מפחיתים את a[0][0] כדי להימנע מספירתו פעמיים מכיוון שפעולות שורה כבר השפיעו על רכיב זה.
- הסכום של שני אלה נותן לנו את מספר מינימלי של פעולות נדרש שכן פעולות שורה מטפלות בהבדלים בעמודה הראשונה ופעולות עמודות מטפלות בהבדלים הנותרים בשורה הראשונה.
// C++ program to find number of transformation // to make two Matrix Equal #include using namespace std; int countOperations(vector<vector<int>> &a vector<vector<int>> &b) { int n = a.size(); int m = a[0].size(); // Create difference matrix (a = a - b) for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { a[i][j] -= b[i][j]; } } // Check if transformation is possible using the property // a[i][j] - a[i][0] - a[0][j] + a[0][0] should be 0 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { if (a[i][j] - a[i][0] - a[0][j] + a[0][0] != 0) { return -1; } } } int result = 0; // Add operations needed for first column for (int i = 0; i < n; i++) { result += abs(a[i][0]); } // Add operations needed for // first row (excluding a[0][0]) for (int j = 0; j < m; j++) { result += abs(a[0][j] - a[0][0]); } return result; } int main() { vector<vector<int>> a = {{1 1} {1 1}}; vector<vector<int>> b = {{1 2} {3 4}}; cout << countOperations(a b); return 0; }
Java // Java program to find number of transformation // to make two Matrix Equal import java.util.*; class GfG { static int countOperations(int[][] a int[][] b) { int n = a.length; int m = a[0].length; // Create difference matrix (a = a - b) for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { a[i][j] -= b[i][j]; } } // Check if transformation is possible using the // property a[i][j] - a[i][0] - a[0][j] + a[0][0] // should be 0 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { if (a[i][j] - a[i][0] - a[0][j] + a[0][0] != 0) { return -1; } } } int result = 0; // Add operations needed for first column for (int i = 0; i < n; i++) { result += Math.abs(a[i][0]); } // Add operations needed for // first row (excluding a[0][0]) for (int j = 0; j < m; j++) { result += Math.abs(a[0][j] - a[0][0]); } return result; } public static void main(String[] args) { int[][] a = { { 1 1 } { 1 1 } }; int[][] b = { { 1 2 } { 3 4 } }; System.out.println(countOperations(a b)); } }
Python # Python program to find number of transformation # to make two Matrix Equal def countOperations(a b): n = len(a) m = len(a[0]) # Create difference matrix (a = a - b) for i in range(n): for j in range(m): a[i][j] -= b[i][j] # Check if transformation is possible using the property # a[i][j] - a[i][0] - a[0][j] + a[0][0] should be 0 for i in range(1 n): for j in range(1 m): if a[i][j] - a[i][0] - a[0][j] + a[0][0] != 0: return -1 result = 0 # Add operations needed for first column for i in range(n): result += abs(a[i][0]) # Add operations needed for # first row (excluding a[0][0]) for j in range(m): result += abs(a[0][j] - a[0][0]) return result if __name__ == '__main__': a = [ [1 1] [1 1] ] b = [ [1 2] [3 4] ] print(countOperations(a b))
C# // C# program to find number of transformation // to make two Matrix Equal using System; class GfG { static int countOperations(int[ ] a int[ ] b) { int n = a.GetLength(0); int m = a.GetLength(1); // Create difference matrix (a = a - b) for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { a[i j] -= b[i j]; } } // Check if transformation is possible using the // property a[i j] - a[i 0] - a[0 j] + a[0 0] // should be 0 for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { if (a[i j] - a[i 0] - a[0 j] + a[0 0] != 0) { return -1; } } } int result = 0; // Add operations needed for first column for (int i = 0; i < n; i++) { result += Math.Abs(a[i 0]); } // Add operations needed for // first row (excluding a[0 0]) for (int j = 0; j < m; j++) { result += Math.Abs(a[0 j] - a[0 0]); } return result; } static void Main(string[] args) { int[ ] a = { { 1 1 } { 1 1 } }; int[ ] b = { { 1 2 } { 3 4 } }; Console.WriteLine(countOperations(a b)); } }
JavaScript // JavaScript program to find number of transformation // to make two Matrix Equal function countOperations(a b) { let n = a.length; let m = a[0].length; // Create difference matrix (a = a - b) for (let i = 0; i < n; i++) { for (let j = 0; j < m; j++) { a[i][j] -= b[i][j]; } } // Check if transformation is possible using the // property a[i][j] - a[i][0] - a[0][j] + a[0][0] should // be 0 for (let i = 1; i < n; i++) { for (let j = 1; j < m; j++) { if (a[i][j] - a[i][0] - a[0][j] + a[0][0] !== 0) { return -1; } } } let result = 0; // Add operations needed for first column for (let i = 0; i < n; i++) { result += Math.abs(a[i][0]); } // Add operations needed for // first row (excluding a[0][0]) for (let j = 0; j < m; j++) { result += Math.abs(a[0][j] - a[0][0]); } return result; } //Driver code let a = [ [ 1 1 ] [ 1 1 ] ]; let b = [ [ 1 2 ] [ 3 4 ] ]; console.log(countOperations(a b));
תְפוּקָה
3
מורכבות זמן: O(n*m)
מרחב עזר: O(1)
הצטרף לעדכון mysqlצור חידון