Rompila in due problemi:
- Come compareresti due array quadrati - chiamerò queste matrici - che non possono essere ruotati o riflessi, e
- In che modo puoi confrontare un oggetto che può essere ruotato e riflettere su un altro elemento
Implementare il primo problema con un approccio ingenuo dà una risposta molto semplice - cammina le matrici in parallelo, fermandosi quando trovi valori non uguali. Se si cammina l'intera matrice senza valori non uguali, le matrici sono uguali. Camminare nella matrice, scorrere tra le colonne, anello interno attraverso ogni riga e confrontare i valori. Nota che camminare sulla matrice ci consente di enumerare tutti gli elementi della matrice come se fossero una singola raccolta lineare.
Per il secondo problema, ci sono otto modi diversi di ruotare e riflettere una matrice. Ci sono quattro angoli da usare come punto di partenza, e un algoritmo può camminare da ogni angolo in due direzioni (vale a dire orizzontalmente o verticalmente). Quindi dovremo eseguire il "problema 1" su ciascuna delle otto prospettive della matrice originale.
Come potrei implementarlo? Possiamo camminare le otto matrici in parallelo o in sequenza; Implementerò questo in modo sequenziale come potenzialmente più veloce (se la prima matrice controllata è una corrispondenza, non sono richiesti altri controlli) ma, cosa più importante, sarà più semplice.
Ciascuna delle otto matrici da controllare dovrebbe essere rappresentata da una funzione di camminata f(x)
per recuperare il valore xth
. Ad esempio, in n
di n
matrice quadrata A
,
f1(x) = A[x % n, x / n]; // walking rows first, then columns
f2(x) = A[x / n, x % n]; // walking columns first, then rows
// using a different starting point
f3(x) = A[n - (x / n), x % n];
f4(x) = A[n - (x % n), x / n];
e così via. Ora semplicemente,
foreach walking function
foreach value in walking function
if value not equal to corresponding value in target
next walking function
return true // not non-equal values found
return false // none of the functions matched