CCF模擬試題棋局評估--java
一、問題描述
試題編號: | 201803-4 |
試題名稱: | 棋局評估 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 Alice和Bob正在玩井字棋遊戲。 例如上圖中的局面,Alice已經獲勝,同時棋盤上有2個空格,所以局面得分為2+1=3。 由於Alice並不喜歡計算,所以他請教擅長程式設計的你,如果兩人都以最優策略行棋,那麼當前局面的最終得分會是多少? 輸入格式 輸入的第一行包含一個正整數T,表示資料的組數。 輸出格式 對於每組資料,輸出一行一個整數,表示當前局面的得分。 樣例輸入 3 樣例輸出 3 樣例說明 第一組資料: 資料規模和約定 對於所有評測用例,1 ≤ T ≤ 5。 |
二、考慮了很多可能,但是不知道為什麼會是0分,輸入各種獲勝可能,均可以得出結果,或許漏掉了什麼,求指出問題。
三、貼出思路
package com.lut.wy;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
class chess{
int x;
int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int [][]a = new int[3*n][3];
for(int i=0;i<a.length;i++) {
if(!sc.hasNextLine()) {
break;
}
for (int k = 0; k < a[i].length; k++) {
a[i][k]=sc.nextInt();
}
}
int[] b = new int[n];
b=div(a,n);
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
}
public static int[] div(int[][]a,int n) {
int rel[] = new int[n];
int index=0;
int k=0;
int b[][] = new int [3][3];
for(int i=0;i<a.length;i++) {
boolean flage=true;
for(int j=0;j<a[i].length;j++) {
if(i!=0) {
if(i%3==0 && flage) {
flage=false;
k++;
rel[index]=handle(b);
index++;
}
}
b[i-3*k][j]=a[i][j];
}
if(i==a.length-1) {
rel[index]=handle(b);
}
}
return rel;
}
public static int handle(int a[][]) {
int grade=0;
List<chess> i_1=new ArrayList<>();
List<chess> i_2=new ArrayList<>();
List<chess> i_0=new ArrayList<>();
for(int i=0;i<a.length;i++) {
for(int j=0;j<a[i].length;j++) {
chess che = new Main().new chess();
che.setX(i);
che.setY(j);
switch (a[i][j]) {
case 0:
i_0.add(che);
break;
case 1: //0,0 0,1 0,2
i_1.add(che); //1,0 1,1 1,2
break; //2,0 2,1 2,2
case 2:
i_2.add(che); //1,1 3,1 3 3 1,3
break;
default:
break;
}
}
}
if(i_2.size()>2) {
for(int i=0;i<i_2.size();i++) {
for(int j=i+1;j<i_2.size();j++) {
if(((i_2.get(j).getX()!=i_2.get(i).getX()) && (i_2.get(j).getY()!=i_2.get(i).getY()))
||((i_2.get(j).getX()==i_2.get(i).getX()) && (i_2.get(j).getY()!=i_2.get(i).getY()))
||((i_2.get(j).getX()!=i_2.get(i).getX()) && (i_2.get(j).getY()==i_2.get(i).getY()))) {
int x=i_2.get(i).getX()+i_2.get(j).getX();
int y=i_2.get(i).getY()+i_2.get(j).getY();
for(int k=0;k<i_2.size();k++) {
if(((i_2.get(k).getX() != i_2.get(i).getX()) && (i_2.get(k).getY() != i_2.get(i).getY())
||((i_2.get(k).getX() == i_2.get(i).getX()) && (i_2.get(k).getY() != i_2.get(i).getY()))
||((i_2.get(k).getX() != i_2.get(i).getX()) && (i_2.get(k).getY() == i_2.get(i).getY())))
&& ((i_2.get(k).getX() != i_2.get(j).getX()) && (i_2.get(k).getY() != i_2.get(j).getY())
||((i_2.get(k).getX() == i_2.get(j).getX()) && (i_2.get(k).getY() != i_2.get(j).getY()))
||((i_2.get(k).getX() != i_2.get(j).getX()) && (i_2.get(k).getY() == i_2.get(j).getY())))) {
if(((3-x)== i_2.get(k).getX() && (3-y) == i_2.get(k).getY()) || x==4 ||y==4) {
if( x==4 || y==4) {
grade=-4;
return grade;
}
switch (i_2.size()) {
case 4:
grade=-1-1;
return grade;
case 3:
grade=-3-1;
return grade;
default:
break;
}
}
}
}
}
}
}
}
if(i_1.size()>=2) {
for(int i=0;i<i_1.size();i++) {
for(int j=i+1;j<i_1.size();j++) {
if(i_1.get(j).getX()!= i_1.get(i).getX() && i_1.get(j).getY() != i_1.get(i).getY()
||(i_1.get(j).getX()== i_1.get(i).getX()) && (i_1.get(j).getY() != i_1.get(i).getY())
||(i_1.get(j).getX()!= i_1.get(i).getX()) && (i_1.get(j).getY() == i_1.get(i).getY())) {
int x=i_1.get(i).getX()+i_1.get(j).getX();
int y=i_1.get(i).getY()+i_1.get(j).getY();
for(int k=0;k<i_0.size();k++) {
if(((3-x) == i_0.get(k).getX() && (3-y)==i_0.get(k).getY())
||(0 == i_0.get(k).getX() && (3-y)==i_0.get(k).getY())
||((3-x) == i_0.get(k).getX() && 0==i_0.get(k).getY())) {
if( x==4 || y==4) {
grade=5;
return grade;
}
switch (i_1.size()) {
case 4:
grade=1+1;
return grade;
case 3:
grade=2+1;
return grade;
case 2:
grade=4+1;
return grade;
default:
break;
}
}
if(k==i_0.size()-1) {
grade=0;
}
}
}
}
}
}
return grade;
}
}