Az alábbi letöltési lehetőségek közül választhatsz: (
segítség)
Típus: text/plain
Tartalmaz szöveget
Karakterkódolás: utf-8
Méret: 9 KB
package hu.krivan.szakkor.szamjegy;
import java.util.*;
import java.io.*;
class Common {
public static int[] values;
}
@author
class Problem {
public ArrayList<ArrayList<Integer>> numbers = new ArrayList<ArrayList<Integer>>();
private int maxIdx = 0;
public int eqIndex = 0;
public int id = -1;
private int getIdxFromChar(char a) {
return (int) a - 65;
}
public Problem(String s, int idx) {
id = idx;
String[] eqSides = s.split("=");
if (eqSides.length != 2) {
return;
}
String[] numbers1 = eqSides[0].split("\\+");
eqIndex = numbers1.length;
String[] numbers2 = eqSides[1].split("\\+");
String[] numbers_ = new String[numbers1.length + numbers2.length];
for (int i = 0; i < numbers1.length; i++) {
numbers_[i] = numbers1[i];
}
for (int i = 0; i < numbers2.length; i++) {
numbers_[i + numbers1.length] = numbers2[i];
}
int[] indicies = new int[26];
for (int i = 0; i < 26; i++) {
indicies[i] = -1;
}
int c = 0;
for (int i = 0; i < numbers_.length; i++) {
ArrayList<Integer> number = new ArrayList<Integer>();
for (int a = 0; a < numbers_[i].length(); a++) {
if (indicies[getIdxFromChar(numbers_[i].charAt(a))] == -1) {
indicies[getIdxFromChar(numbers_[i].charAt(a))] = c++;
}
number.add(indicies[getIdxFromChar(numbers_[i].charAt(a))]);
}
numbers.add(number);
}
maxIdx = c - 1;
}
@return
public boolean isGoodPermutation() {
int X = 0;
int Y = 0;
boolean endOfNumbers = true;
for (int i = 0; i < 12; i++) {
for (int j = 0; j < numbers.size(); j++) {
if (Common.values[numbers.get(j).get(0)] == 0) {
return false;
}
if (numbers.get(j).size() > i) {
endOfNumbers = false;
if (j < eqIndex) {
X += Common.values[numbers.get(j).get(numbers.get(j).size() - i - 1)];
} else {
Y += Common.values[numbers.get(j).get(numbers.get(j).size() - i - 1)];
}
}
}
if (X % 10 != Y % 10) {
return false;
}
X /= 10;
Y /= 10;
if (endOfNumbers) {
break;
}
}
return true;
}
@param
@return
public boolean shouldCheck(int j) {
return j <= maxIdx;
}
}
@author
class Solution {
ArrayList<ArrayList<Integer>> numbers;
int[] values;
int eqIndex;
@param
public Solution(Problem p) {
numbers = p.numbers;
eqIndex = p.eqIndex;
this.values = Common.values.clone();
}
public void print( PrintWriter out ) throws IOException {
for (int i = 0; i < numbers.size(); i++) {
if (i == eqIndex) {
out.print("=");
} else if (i != 0) {
out.print("+");
}
for (int j = 0; j < numbers.get(i).size(); j++) {
out.print(values[numbers.get(i).get(j)]);
}
}
out.println();
}
}
public class Program {
private ArrayList<Problem> problems;
private int lastSwappedIdx = -1;
public Program() {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("szamjegy.be"));
problems = new ArrayList<Problem>();
String str;
int id = 0;
while ((str = in.readLine()) != null) {
problems.add(new Problem(str, id++));
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
Program p = new Program();
p.solveProblems();
}
public void solveProblems() {
Common.values = new int[10];
for (int i = 0; i < 10; i++) {
Common.values[i] = i;
}
Solution[] solutions = new Solution[problems.size()];
Problem p;
do {
for (int i = 0; i < problems.size(); i++) {
p = problems.get(i);
if (p.shouldCheck(lastSwappedIdx)) {
if (p.isGoodPermutation()) {
solutions[p.id] = new Solution(p);
problems.remove( p );
if (problems.size() == 0) {
break;
}
}
}
}
} while (hasNextPermutation());
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("szamjegy.ki"));
for (int i = 0; i < solutions.length; i++) {
solutions[i].print( out );
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
out.close();
}
}
@return
private boolean hasNextPermutation() {
int j, m, k;
int n = 10;
j = n - 2;
while (Common.values[j] >= Common.values[j + 1]) {
j--;
if (j == -1) {
break;
}
}
if (j == -1) {
return false;
}
m = n - 1;
while (Common.values[j] >= Common.values[m]) {
m--;
if (m == -1) {
break;
}
}
lastSwappedIdx = j;
swap(j, m);
k = j + 1;
m = n - 1;
while (k < m) {
swap(k++, m--);
}
return true;
}
private void swap(int j, int m) {
int tmp = Common.values[j];
Common.values[j] = Common.values[m];
Common.values[m] = tmp;
}
}