题目描述:
对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 45 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。
例如:
解题思路:
提示:矩阵从左下方到右上方排列,从左向右与从上向下看顺序不同,从左上方到右下方排列,从左向右与从上向下看顺序相同
暴力求解:
- 每一行从左向右排列
for (int l=j+1; l < 50; l++) { //(0,1),(0,2)
if (p<c[i][l]) sum++;
}
- 每一列从上向下排列
for (int l = i+1; l < 30; l++) { //(1,0)(1,1)(1,2)
if (p<c[l][j]) sum++;
}
- 从左上到右下排列
int l=i+1;int r=j+1;
while (l<30 && r<50){
if(p<c[l][r]) sum++; //(1,1)(2,2)(3,3)
l+=1;r+=1;
}
每一行每一行的向右下比较,两个值无论是从左向右看还是从上向下看顺序都一样。
- 从左下到右上排列
l=i+1;r=j-1;
while (l<30 && r>=0){
if (p<c[l][r] || p>c[l][r]) sum++;
l+=1;r-=1;
}
总体代码:
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
char[][] c=new char[30][50];
// 将矩阵中的每一个元素转换成字符。
for (int i = 0; i < c.length; i++) {
c[i]=s.nextLine().toCharArray();
}
int sum=0;
for (int i = 0; i < 30; i++) { // 行数控制
for (int j = 0; j < 50; j++) { // 列数控制
char p=c[i][j];
//同一行从左向右看,一行一行循环。
for (int l=j+1; l < 50; l++) { //(0,1),(0,2)
if (p<c[i][l]) sum++;
}
//同一列从上往下看,一列
for (int l = i+1; l < 30; l++) { //(1,0)(1,1)(1,2)
if (p<c[l][j]) sum++;
}
//45度右下看,一个位置一个位置与右下比较。
int l=i+1;int r=j+1;
while (l<30 && r<50){
if(p<c[l][r]) sum++; //(1,1)(2,2)(3,3)
l+=1;r+=1;
}
//45度左下到右上,从右上到左下,从左向右看,与从上向下看是两个顺序,不一样的,所以不能按照从左上到右下比较一个,
l=i+1;r=j-1;
while (l<30 && r>=0){
if (p<c[l][r] || p>c[l][r]) sum++; //
l+=1;r-=1;
}
}
}
System.out.println(sum);
}
}
总结:
提示:理解的可能不对,请大佬批评指正,有没有更好的方法!