This problem has an interesting algorithm used it in. How to rotate a square matrix. Basically if you want to rotate a square matrix by 90 degress you can notice that 4 elements in the 2D array get changed in a cyclical manner. You can just repeat this for (almost) one quarter of the square that you are rotating.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.StringTokenizer; /** * * @author Sanchit M. Bhatnagar * @see http://uhunt.felix-halim.net/id/74004 * */ public class P10855 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(System.out); StringTokenizer st = null; while (true) { st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int n = Integer.parseInt(st.nextToken()); if (N + n == 0) break; char[][] big = new char[N][N]; for (int i = 0; i < N; i++) { char[] line = br.readLine().toCharArray(); for (int j = 0; j < N; j++) { big[i][j] = line[j]; } } char[][] small = new char[n][n]; for (int i = 0; i < n; i++) { char[] line = br.readLine().toCharArray(); for (int j = 0; j < n; j++) { small[i][j] = line[j]; } } out.print(check(big, small) + " "); rotate(small); out.print(check(big, small) + " "); rotate(small); out.print(check(big, small) + " "); rotate(small); out.println(check(big, small)); } out.close(); br.close(); } private static int check(char[][] big, char[][] small) { int ans = 0; for (int i = 0; i <= big.length - small.length; i++) { for (int j = 0; j <= big.length - small.length; j++) { if (big[i][j] == small[0][0]) { boolean found = true; for (int k = 0; k < small.length; k++) { for (int l = 0; l < small.length; l++) { if (big[i + k][j + l] != small[k][l]) { found = false; break; } } } if (found) ans++; } } } return ans; } private static void rotate(char[][] m) { int n = m.length; for (int i = 0; i < n / 2; i++) for (int j = 0; j < (n + 1) / 2; j++) { char temp = m[i][j]; m[i][j] = m[n - 1 - j][i]; m[n - 1 - j][i] = m[n - 1 - i][n - 1 - j]; m[n - 1 - i][n - 1 - j] = m[j][n - 1 - i]; m[j][n - 1 - i] = temp; } } }