算法技巧-1909 字母三角形-二维数组坐标操作

本文探讨了一个特定的算法挑战,即在由小写字母构成的字母三角形中,寻找所有由相同字母组成的等边三角形的顶点。通过详细的代码解释,展示了如何遍历所有可能的三角形组合,比较顶点上的字母,并收集满足条件的字母。最终,输出满足条件的字母列表,若无符合条件的字母,则输出NoSolution。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1909 字母三角形
给定一个整数n,有n*(n+1)/2个圆,每个圆上面有一个字母。把他们摆放成正三角形的形状,第一行1个,第二行2个,…,第n行n个。现在要求判断一下,哪些等边三角形的顶点是同一字母组成的,找出这些字母。三角形的构造过程:选三个相同字母,把它们所在圆的圆心连起来。如图是n=4的情况。其中字母a和字母c是满足条件的。
abccddadca
输入单组测试数据。
第一行有一个整数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循环搞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PROBIE_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值