1909 字母三角形
给定一个整数n,有n*(n+1)/2个圆,每个圆上面有一个字母。把他们摆放成正三角形的形状,第一行1个,第二行2个,…,第n行n个。现在要求判断一下,哪些等边三角形的顶点是同一字母组成的,找出这些字母。三角形的构造过程:选三个相同字母,把它们所在圆的圆心连起来。如图是n=4的情况。其中字母a和字母c是满足条件的。
输入单组测试数据。
第一行有一个整数n(1<=n<=12)。
第二行有n*(n+1)/2个小写字母,每种字母不超过3个,表示三角形按行访问的字母序列。输出输出所有满足条件的字母,按照字母序从小到大输出。如果没有解输出No Solution。
样例输入1
2
aaa
样例输入2
2
aab
输出样例样例输出1
a
样例输出2
No Solution
对于三个顶点的对比,看似简单,但要求遍历其中所有三角形的所有可以作为顶点的坐标,考察对于二维数组坐标的理解
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String z = sc.next();
char[][] l = new char[n][n];
int w = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
l[i][j]=z.charAt(w++);
}
}
//00 n0 nn 11 n-10 nn-1 22 n-20 nn-2
boolean p = true;
ArrayList<Character> arr = new ArrayList<Character>();
for (int i = 0; i < n-1; i++) {//三角形x坐标
for (int j = 0; j <= i; j++) {//三角形y坐标
for (int k = i+1; k < n; k++) {//三角形高度
int zx = k;
int yx = k-i+j;
for (int m = 0; m < k-i; m++) {//循环不同顶点
int x = i+m;
int y = j+m;
if (l[x][y]==l[zx][j]&&l[x][y]==l[k][yx]) {
if (!arr.contains(l[x][y])) {
arr.add(l[x][y]);
}
p=false;
}
zx--;
yx--;
}
}
}
}
Collections.sort(arr);
if (p) {
System.out.println("No Solution");
}else{
for (Character c : arr) {
System.out.print(c);
}
}
}
}
四个for循环搞