我正在研究Project Euler问题11: 在下面的20×20网格中,沿对角线的四个数字标记为红色。
(我没有包含数字,所以我的问题更容易理解。如果你想引用它,链接是https://projecteuler.net/problem=11)
这些数字的乘积是26×63×78×14 = 1788696。
20×20网格中相同方向(上,下,左,右或对角)的四个相邻数字的最大乘积是什么?
我的问题是我想将这些数据输入2D arraylist,但我不确定如何。到目前为止,这是我的代码。我知道解决这个问题的方法可能不是很好,但是我仍然在学习,正如你可以清楚地说明的那样,所以不要真正关心改进代码并使其更简单或更短。我所需要的只是知道如何将它存储为2D arraylist,然后我相信我应该很高兴。
import java.util.Scanner;
import java.io.File;
import java.util.ArrayList;
@SuppressWarnings("unchecked")
public class main{
public static int row(ArrayList data){
int product=1;//product of any four numbers in sequence across
int max=0;//max product going across
int item;//sets value of data
int y=0;//counts position of data (1-4)
int rownum;//number row
int column;//number column
Object num;//used to extract data from arraylist before converting into int
for(column=0;column<16;column++){
while(y<4){
item=x+y;
num=data.get(item);
product*=(Integer) num;
if (product>max){
max=product;
}
y++;
}
product=1;
y=0;
}
return max;
}
public static void main(String[] args){
File path=new File("../numbers.txt");
int word;//represents number column
int max;//max product of any four numbers in order
int product=1;//max product of each individual way (across, down, diagonal)
int line;//each individual number
ArrayList data=new ArrayList();
try{
Scanner in=new Scanner(path);
while (in.hasNextLine()){
for(word=0;word<16;word++){//goes across a row
line=in.nextInt();
data.add(line);//adds file to arraylist
}
}
}
catch(Exception ex){
}
max=row(data);
System.out.println(max);
}
感谢您的所有帮助。
答案 0 :(得分:1)
从技术上讲,二维ArrayList是ArrayLists的ArrayList:
ArrayList<ArrayList<Integer>> numbers = new ArrayList<>();
但是,在这种情况下,您可能希望使用这样的2D数组(也是数组数组):
int[][] numbers = new int[20][20];
然后您可以使用嵌套for循环输入您的数字:
for (int i=0; i<20; i++){
for (int j=0; j<20; j++){
numbers[i][j] = /*yadda yadda*/;
}
}