// Ez annak a programnak a 0.35-as verzioja, amely a GO jatek lehetseges lepesei kozul emel ki tizet.
import java.text.*;
import java.util.*;
public class board {
locus[] grid;
int size, length;
public board (){
boolean ok;
do {
System.out.print("A tabla merete (8 es 20 kozotti paratlan): ");
size = readInt();
ok = (size%2==1) & (size>8) & (size<20);
} while (!ok);
length = size*size;
grid = new locus[length+2];
for (int i=0; i<length; i++)
grid[i] = new locus(size, i);
grid[length] = new locus(length+1);
}
public void game (){ //A jatek levezetese.
int lepes;
int[] kiemeltek = new int[10];
boolean passz, egyik, masik;
egyik = false;
masik = false;
while (true) {
proposer(1);
lepes = readStep();
if (lepes<length){
grid[lepes].step(1);
colouring();
masik = false;
}
else {
System.out.println("Passz");
egyik = true;
}
if (egyik & masik) break;
proposer(-1);
lepes = readStep();
if (lepes<length){
grid[lepes].step(-1);
colouring();
egyik = false;
}
else {
System.out.println("Passz");
masik = true;
}
if (egyik & masik) break;
}
}
public void proposer (int color){ //Kiemeles: Red eseten 1.
int i, j, cs; //
for (i=0; i<length; i++){
if (grid[i].getSpec(3) ==0){
grid[i].step(color); //Atmenetileg feltesz egy kovet.
dyeing(); //Meghatarozza a racspontok atmeneti szinet.
grid[i].setE((int)Math.exp(expansion(color)/grid[i].getSpec(0))); //Meghatarozza a gondolkodás eredmenyet.
grid[i].setD(defence(color)/grid[i].getSpec(0)); //Meghatarozza az erzekeles eredmenyet.
grid[i].setA(assault(color)); //Meghatarozza az erzelem eredmenyet.
grid[i].abate(); //Leveszi az atmenetileg feltett kovet.
}
else {
grid[i].setE(0);
grid[i].setD(0);
grid[i].setA(0);
}
}
intuition(color); //Beallitja a sulyozott eredmenyt.
printBoard(3); //A kovek kiiratasa.
//printBoard(4); //A piros szinkodok kiiratasa.
//printBoard(5); //A kek szinkodok kiiratasa.
printBoard(8); //A terulet novelo hatas kiiratasa.
printBoard(9); //A stabilitas novelo hatas kiiratasa.
//printBoard(6); //Az atmeneti szinkod kiiratasa.
printBoard(10); //Az ellenhatas csokkento hatas kiiratasa.
printBoard(11); //Az osszetett hatas kiiratasa.
int[] kiemeltek = new int[length+1];
for (i=0; i<length+1; i++)
kiemeltek[i] = i; //Mint egy indextomb.
for (i=length; i>0; i--){ //Az indextombot I szerint rendezi.
for (j=0; j<i; j++) {
if (grid[kiemeltek[j+1]].getSpec(11) > grid[kiemeltek[j]].getSpec(11)){
cs = kiemeltek[j];
kiemeltek[j] = kiemeltek[j+1];
kiemeltek[j+1] = cs;
}
}
}
for (i=0; i<10; i++) //Kiirja a 10 legnagyobb I erteku racspont koordinatajat.
System.out.print(grid[kiemeltek[i]].getName()+"; "+((int)grid[kiemeltek[i]].getSpec(11))+"; ");
System.out.println();
}
public double expansion (int color){ //Meghatarozza a teruletnovelo hatast.
double teruletNovekedes = 0.0; //A kulonbseg maximumat keressuk.
boolean ujTerulet;
for (int i=0; i<length; i++){
ujTerulet = (0>=color*(grid[i].getSpec(4)-grid[i].getSpec(5))
& (0<color*(grid[i].getSpec(6)-grid[i].getSpec(7))));
if (ujTerulet){
//System.out.print(color*(grid[i].getSpec(6)-grid[i].getSpec(7))+"; ");
teruletNovekedes += color*(grid[i].getSpec(6)-grid[i].getSpec(7));
}
}
//double expNovekedes = Math.exp(teruletNovekedes/3000);
return teruletNovekedes/10;
}
public int defence (int color){ //Meghatarozza a stabilitasnovelo hatast.
int stabilitasNovekedes = 0; //A maximumat keressuk.
boolean sajatTerulet;
for (int i=0; i<length; i++){
sajatTerulet = (0<color*(grid[i].getSpec(4)-grid[i].getSpec(5)));
if (sajatTerulet)
stabilitasNovekedes += color*(grid[i].getSpec(5)+grid[i].getSpec(6)-grid[i].getSpec(7)-grid[i].getSpec(4));
}
stabilitasNovekedes *= 10;
return stabilitasNovekedes;
}
public int assault (int color){ //Meghatarozza az ellenfel gyengitesenek hatasat.
int ellenhatasCsokkenes = 0;
double regiHatas = 0.0;
double ujHatas = 0.0;
for (int i=0; i<length; i++){
if (0>color*(grid[i].getSpec(4)-grid[i].getSpec(5)))
regiHatas += color*(grid[i].getSpec(4)-grid[i].getSpec(5));
if (0>color*(grid[i].getSpec(6)-grid[i].getSpec(7)))
ujHatas += color*(grid[i].getSpec(6)-grid[i].getSpec(7));
}
if (regiHatas<0 && ujHatas<0) //regiHatas < ujHatas!!!
ellenhatasCsokkenes += (int) (100*(Math.log(regiHatas/ujHatas))); //Pozitiv elojelu!!!
return ellenhatasCsokkenes;
}
public void intuition (int color){ //Beallitja a masik harom ertek sulyozott atlagabol adodo sorrendet.
double osszhatas;
double E = 0.0;
double D = 0.0;
double A = 0.0;
for (int i=0; i<length; i++){
if (0<grid[i].getSpec(8)) E += grid[i].getSpec(8);
if (0<grid[i].getSpec(9)) D += grid[i].getSpec(9);
if (0<grid[i].getSpec(10)) A += grid[i].getSpec(10);
}
System.out.println(E+"; "+D+"; "+A+"; ");
for (int i=0; i<length; i++){
osszhatas = 0.0;
boolean ok = (0<=grid[i].getSpec(6)) & (0<=grid[i].getSpec(7)) & (0<=grid[i].getSpec(8) & (0==grid[i].getSpec(3)));
if (ok){
if (E>0) osszhatas += 2*grid[i].getSpec(8)/E;
if (D>0) osszhatas += grid[i].getSpec(9)/D;
if (A>0) osszhatas += grid[i].getSpec(10)/A;
grid[i].setI((int)(1000*osszhatas));
}
else grid[i].setI(0);
}
}
public void colouring (){ //Meghatarozza a racspontok vegso szinet.
for (int i=0; i<length; i++)
grid[i].setColor(holding(i));
}
public void dyeing (){ //Meghatarozza a racspontok atmeneti szinet.
for (int i=0; i<length; i++)
grid[i].setDye(holding(i));
}
public int[] holding (int i){ //Visszaadja a kovek hatasat az i-edik racspontra.
int[] holder = new int[2];
holder[0] = 0;
holder[1] = 0;
double q, d;
for (int j=0; j<length; j++){
q = grid[i].getBorder()*grid[j].getBorder()/1000;
if (q>2000) q = 2166.0;
d = D(i, j);
if (grid[j].getSpec(3)>0){ //Az elso lepes elott csak ez lehet.
holder[0] += (int)(q/Math.pow(2,d));
}
else if (grid[j].getSpec(3)<0){
holder[1] += (int)(q/Math.pow(2,d));
}
}
boolean[] s = stabil(i);
if (s[0]) holder[0] = 15000;
else if (s[1]) holder[1] = 15000;
else holder = weighted(holder);
return holder;
}
public int[] weighted (int[] w){ //Visszaadja hatas sulyozott erteket.
int n = 500; //Az arnyalatok szama: 1 + 14900%n;
double q = 4.49; //Az eredmenyt kezdetben 4.5 szorosere transzponaljuk;
if (q*w[0]>14900.0) q = 14900.0/w[0];
if (q*w[1]>14900.0) q = 14900.0/w[1];
w[0] = n*((int)(q*w[0]/n));
w[1] = n*((int)(q*w[1]/n));
return w; //Elso kozelitesben.
}
public double D (int i, int j){ //Visszaadja az i-edik es a j-edik racspont tavolsagat.
return Math.sqrt((grid[i].getX()-grid[j].getX())*(grid[i].getX()-grid[j].getX())
+ (grid[i].getY()-grid[j].getY())*(grid[i].getY()-grid[j].getY()));
}
public boolean[] stabil (int i) { //Stabil alakzathoz tartozik-e az adott racspont?
boolean[] s = new boolean[2];
s[0] = false; //Amig az alakzat stabilitasat nem vizsgaljuk.
s[1] = false;
return s;
}
public int readInt() { //Beolvas egy int típusú változót.
while(true) {
try {
return Integer.parseInt(readLine().trim());
}
catch(NumberFormatException e) {
System.out.println("Nem egesz! Ujra!");
}
}
}
public int readStep (){
int step = length;
String lepes = (readLine().trim()).toUpperCase();
for (int i=0; i<length; i++){
if (lepes.equals(grid[i].getName())) {
step = i;
break;
}
}
//System.out.println(step);
return step;
}
public String readLine (){ //Beolvas egy Stringet.
int ch;
String str = "";
boolean done = false;
while (!done) {
try {
ch = System.in.read();
if (ch < 0 || (char)ch == 'n')
done = true;
else if ((char)ch != 'r')
str = str + (char)ch;
}
catch(java.io.IOException e) {
done = true;
}
}
return str;
}
public void printBoard(int a){
if ((a>=0) & (a<12)){
System.out.println();
for (int i=0; i<size; i++) {
for (int j=0; j<size; j++) {
System.out. print(grid[i*size+j].getSpec(a)+"; ");
}
System.out.println();
}
}
else System.out.print("Ilyen attributum nincs.");
}
public static void main (String[]args){
(new board ()).game(); //Megjelenitesi teszt.
}
}
class locus {
private int[] specifies = new int[12];
private NumberFormat nf = NumberFormat.getInstance(Locale.US);
private final String spaces = ("00");
private String name;
public locus (int size, int ID){
int x, y;
x = 1+ID%size;
y = 1+(1+ID-x)/size;
boolean sarok = (x==1&y==1)|(x==1&y==size)|(x==size&y==1)|(x==size&y==size);
boolean szel = x==1 | y==1 | x==size | y==size;
if (!szel) specifies[0] = 1000; //border
else if (!sarok) specifies[0] = 1625;
else specifies[0] = 2166;
specifies[1] = x;
specifies[2] = y;
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(0);
name = nf.format(y); //A szamot String-ge alakitja.
if (name.length() < 2)
name = spaces.substring(0,2-name.length()) + name; //Szukseg eseten 0-t tesz ele.
name = (char) (x+64) + name; //Ele rakja az oszlop betujelet.
//System.out.print(name+"; ");
specifies[3] = 0; //n: A racsponton levo kovek szama lehet: -1; 0; 1.
specifies[4] = 0; //color P: a kezdeti szinertek nulla.
specifies[5] = 0; //color B
specifies[6] = 0; //dye P: az atmeneti szinertek.
specifies[7] = 0; //dye B
specifies[8] = 0; //E: a teruletnovelo hatas.
specifies[9] = 0; //D: a stabilitasnovelo hatas.
specifies[10] = 0; //A: az ellenhatas csokkento hatas.
specifies[11] = 0; //I: az osszevont hatas
}
public locus (int ID){
specifies[0] = 0; //border
specifies[1] = ID; //x: ez garantaltan nagyobb a tobbi x-nel.
specifies[2] = ID; //y
name = "Pas";
specifies[3] = 0; //n
specifies[4] = 0; //color P
specifies[5] = 0; //color B
specifies[6] = 0; //dye P
specifies[7] = 0; //dye B
specifies[8] = 0; //E
specifies[9] = 0; //D
specifies[10] = 0; //A
specifies[11] = 3; //I
}
public int getSpec (int i){
return specifies[i];
}
public void setE (int e){
specifies[8] = e;
}
public void setD (int d){
specifies[9] = d;
}
public void setA (int a){
specifies[10] = a;
}
public void setI (int i){
specifies[11] = i;
}
public int getX (){
return specifies[1];
}
public int getY (){
return specifies[2];
}
public int getBorder (){ //Visszadja a racspont szinezesi sulyat.
return specifies[0];
}
public void setDye (int[] c){ //Beallitja az atmeneti szint.
specifies[6] = c[0]; //Beallitja a piros arnyalatot.
specifies[7] = c[1]; //Beallitja a kek arnyalatot.
}
public void setColor (int[] c){ //Beallitja a vegso szint.
specifies[4] = c[0]; //Beallitja a piros arnyalatot.
specifies[5] = c[1]; //Beallitja a kek arnyalatot.
}
public void step (int c){ //Piros ko eseten pozitiv; kek ko eseten negativ
if (c>0) specifies[3] = 1;
else if (c<0) specifies[3] = -1;
else specifies[3] = 0;
}
public void abate (){
specifies[3] = 0; //A ko levetele eseten nulla.
}
public String getName (){
return name;
}
}