marcos
17.12.2009, 16:05
Всем привет. Нашел решение к задаче Где waldorf? но оно вроде на яве
помогите перевести. Заранее спасибо! Вот код
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Main {
private static int numLetrasPosibles = 28;
private static char[][] tabla;
private static int m = 0;
private static int n = 0;
private static String[] palabras;
private static ArrayList<Integer>[] posicionesPorLetra = new ArrayList[numLetrasPosibles];
/**
* Método inicial.
*
* @param args
* argumentos.
* @throws IOException
* si falla.
*/
public static void main(String[] args) throws IOException {
// Scanner para la entrada.
Scanner in = new Scanner(new BufferedReader(new InputStreamReader(
System.in)));
int numCasos = leerNum(in);
// Para cada caso
for (int i = 0; i < numCasos; i++) {
// linea en blanco
in.nextLine().split(" ");
// leo my x.
int[] tamanyo = leer2Num(in);
m = tamanyo[0];
n = tamanyo[1];
// inicializar la tabla
tabla = new char[m][n];
// leo la tabla.
leerTabla();
// inicializar array
inicializarPoscionesPorLetra();
// Inicializo las posiciones en que aparece cada caracter.
inicializarCuentas();
// leer num palabras
int numPalabras = leerNum(in);
// inicializo array de palabras.
palabras = new String[numPalabras];
// leer las palabras
for (int k = 0; k < numPalabras; k++) {
String palabraKesima = readLine();
palabraKesima = palabraKesima.toLowerCase();
palabras[k] = palabraKesima;
}
// buscar
// para cada palabra
for (int k = 0; k < numPalabras; k++) {
char[] palabra = palabras[k].toCharArray();
// para cada posicion que está laprimera letra
Iterator<Integer> it = posicionesPorLetra[(int) palabra[0] - 97]
.iterator();
// sobraría xk siempre está la palabra
// tener k buskar..
while (it.hasNext()) {
int fila = ((Integer) (it.next())).intValue();
int columna = ((Integer) (it.next())).intValue();
int[] valido = null;
if (palabra.length > 1) {
valido = buscar(palabra, fila, columna);
}else{
valido[0]=fila;
valido[1]=columna;
}
// si valido entonces salir
if (valido[0] != -1 && valido[1] != -1) {
valido[0]++;
valido[1]++;
System.out.println(valido[0] + " " + valido[1]);
break;
}
}
}
if (numCasos > 1) {
System.out.println("");
}
}
}
private static int[] buscar(char[] palabra, int fila, int columna) {
int[] num = { -1, -1 };
int i, j = 0;
i = fila;
j = columna;
boolean encontrado = true;
// buscar hacia la derecha
encontrado = true;
j = columna;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal bajando hacia derecha
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1 || j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia abajo
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal bajando hacia izq
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1 || j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia la izq
encontrado = true;
i = fila;
j = columna;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal subiendo hacia izq
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0 || j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia arriba
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal subiendo hacia derecha
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0 || j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
return num;
}
private static String readLine() {
StringBuffer sb = new StringBuffer("");
int b = 0;
while (b != '\n' && b >= 0) {
try {
b = System.in.read();
} catch (IOException e) {
return null;
}
if (b != '\r' && b != '\n' && b >= 0)
sb.append((char) b);
}
if (sb.length() == 0 && b < 0)
return null;
return sb.toString().trim();
}
/**
* Inicializa posicionesPorLetra.
*
* @param m
* filas de la tabla.
* @param n
* columnas de la tabla.
*/
private static void inicializarCuentas() {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
posicionesPorLetra[(int) tabla[i][j] - 97].add(i);
posicionesPorLetra[(int) tabla[i][j] - 97].add(j);
}
}
}
/**
* Lee de fila en fila la tabla.
*
* @param m
* filas.
*/
private static void leerTabla() {
// leer la matriz
for (int k = 0; k < m; k++) {
String filaKesima = readLine();
filaKesima = filaKesima.toLowerCase();
// guardarlo en un array...
tabla[k] = filaKesima.toCharArray();
}
}
/**
* Inicializa el array de posicionesPorLetra.
*/
private static void inicializarPoscionesPorLetra() {
for (int k = 0; k < numLetrasPosibles; k++) {
posicionesPorLetra[k] = new ArrayList<Integer>();
}
}
private static int leerNum(Scanner in) {
String[] numeros = in.nextLine().split(" ");
int index = 0;
int num = 0;
for (; index < numeros.length; index++) {
try {
num = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
return num;
}
private static int[] leer2Num(Scanner in) {
int[] num = { 0, 0 };
String[] numeros;
// leo myn
numeros = in.nextLine().split(" ");
int index = 0;
int m = 0;
for (; index < numeros.length; index++) {
try {
m = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
index++;
int n = 0;
for (; index < numeros.length; index++) {
try {
n = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
num[0] = m;
num[1] = n;
return num;
}
}
помогите перевести. Заранее спасибо! Вот код
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Main {
private static int numLetrasPosibles = 28;
private static char[][] tabla;
private static int m = 0;
private static int n = 0;
private static String[] palabras;
private static ArrayList<Integer>[] posicionesPorLetra = new ArrayList[numLetrasPosibles];
/**
* Método inicial.
*
* @param args
* argumentos.
* @throws IOException
* si falla.
*/
public static void main(String[] args) throws IOException {
// Scanner para la entrada.
Scanner in = new Scanner(new BufferedReader(new InputStreamReader(
System.in)));
int numCasos = leerNum(in);
// Para cada caso
for (int i = 0; i < numCasos; i++) {
// linea en blanco
in.nextLine().split(" ");
// leo my x.
int[] tamanyo = leer2Num(in);
m = tamanyo[0];
n = tamanyo[1];
// inicializar la tabla
tabla = new char[m][n];
// leo la tabla.
leerTabla();
// inicializar array
inicializarPoscionesPorLetra();
// Inicializo las posiciones en que aparece cada caracter.
inicializarCuentas();
// leer num palabras
int numPalabras = leerNum(in);
// inicializo array de palabras.
palabras = new String[numPalabras];
// leer las palabras
for (int k = 0; k < numPalabras; k++) {
String palabraKesima = readLine();
palabraKesima = palabraKesima.toLowerCase();
palabras[k] = palabraKesima;
}
// buscar
// para cada palabra
for (int k = 0; k < numPalabras; k++) {
char[] palabra = palabras[k].toCharArray();
// para cada posicion que está laprimera letra
Iterator<Integer> it = posicionesPorLetra[(int) palabra[0] - 97]
.iterator();
// sobraría xk siempre está la palabra
// tener k buskar..
while (it.hasNext()) {
int fila = ((Integer) (it.next())).intValue();
int columna = ((Integer) (it.next())).intValue();
int[] valido = null;
if (palabra.length > 1) {
valido = buscar(palabra, fila, columna);
}else{
valido[0]=fila;
valido[1]=columna;
}
// si valido entonces salir
if (valido[0] != -1 && valido[1] != -1) {
valido[0]++;
valido[1]++;
System.out.println(valido[0] + " " + valido[1]);
break;
}
}
}
if (numCasos > 1) {
System.out.println("");
}
}
}
private static int[] buscar(char[] palabra, int fila, int columna) {
int[] num = { -1, -1 };
int i, j = 0;
i = fila;
j = columna;
boolean encontrado = true;
// buscar hacia la derecha
encontrado = true;
j = columna;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal bajando hacia derecha
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1 || j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia abajo
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal bajando hacia izq
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i + 1 > m - 1 || j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[++i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia la izq
encontrado = true;
i = fila;
j = columna;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal subiendo hacia izq
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0 || j - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][--j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar hacia arriba
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
// buscar diagonal subiendo hacia derecha
encontrado = true;
j = columna;
i = fila;
for (int k = 1; k < palabra.length; k++) {
// Para que no se salga buscando..
if (i - 1 < 0 || j + 1 > n - 1) {
encontrado = false;
break;
}
if (palabra[k] != tabla[--i][++j]) {
encontrado = false;
break;
}
}
if (true == encontrado) {
num[0] = fila;
num[1] = columna;
return num;
}
return num;
}
private static String readLine() {
StringBuffer sb = new StringBuffer("");
int b = 0;
while (b != '\n' && b >= 0) {
try {
b = System.in.read();
} catch (IOException e) {
return null;
}
if (b != '\r' && b != '\n' && b >= 0)
sb.append((char) b);
}
if (sb.length() == 0 && b < 0)
return null;
return sb.toString().trim();
}
/**
* Inicializa posicionesPorLetra.
*
* @param m
* filas de la tabla.
* @param n
* columnas de la tabla.
*/
private static void inicializarCuentas() {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
posicionesPorLetra[(int) tabla[i][j] - 97].add(i);
posicionesPorLetra[(int) tabla[i][j] - 97].add(j);
}
}
}
/**
* Lee de fila en fila la tabla.
*
* @param m
* filas.
*/
private static void leerTabla() {
// leer la matriz
for (int k = 0; k < m; k++) {
String filaKesima = readLine();
filaKesima = filaKesima.toLowerCase();
// guardarlo en un array...
tabla[k] = filaKesima.toCharArray();
}
}
/**
* Inicializa el array de posicionesPorLetra.
*/
private static void inicializarPoscionesPorLetra() {
for (int k = 0; k < numLetrasPosibles; k++) {
posicionesPorLetra[k] = new ArrayList<Integer>();
}
}
private static int leerNum(Scanner in) {
String[] numeros = in.nextLine().split(" ");
int index = 0;
int num = 0;
for (; index < numeros.length; index++) {
try {
num = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
return num;
}
private static int[] leer2Num(Scanner in) {
int[] num = { 0, 0 };
String[] numeros;
// leo myn
numeros = in.nextLine().split(" ");
int index = 0;
int m = 0;
for (; index < numeros.length; index++) {
try {
m = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
index++;
int n = 0;
for (; index < numeros.length; index++) {
try {
n = Integer.parseInt(numeros[index]);
break;
} catch (final NumberFormatException e) {
// Si falla.
}
}
num[0] = m;
num[1] = n;
return num;
}
}