После ваших комментариев под моим первым ответом:
Я думал также о другом решении ... С BFS. Для начальной точки, скажем, 0,0, вы всегда идете на глубину 1 на каждой итерации, поэтому, если вы начинаете с 0,0, вы делаете 1,0 1,1 0,1, а когда вы нажимаете на границы строки или столбца, вы увеличиваете глубину,означает, что на следующей итерации вы идете с 0,2 1,2 2,2 2,1 2,0 и если матрица nxm с n! = m, вы просто пропускаете столбец или строку в зависимости от того, где вы находитесь (проверьте матрицуограничены всегда m и n).
Забыл упомянуть, что таким образом это также будет работать и для писем.
Я решил добавить новый ответ вместо редактирования первогоодин.
Поскольку я не очень знаком с графиками и поиском в ширину, я не могу дать никаких советов по алгоритмам, основанным на BSF.
Но я думаю, что понял вашу идею о том, как вы хотели бы действоватьи вот наивный подход к его реализации. Шаги, которые вы хотите предпринять на каждой итерации
0,0
-----
0,1
1,1
1,0
-----
0,2
1,2
2,2
2,1
2,0
-----
0,3
1,3
2,3
3,3
3,2
3,1
3,0
...
Независимо от того, является ли матрица квадратной или нет, я изначально концентрируюсь на площади квадрата. Например, если это матрица 4x6
, я смотрю только на часть 4x4
и игнорирую последние два столбца. Аналогично, если строки больше столбцов. Для 7x5
я посмотрю на 5x5
и проигнорирую последние две строки. На каждой итерации я буду использовать два внутренних цикла: первый - для увеличения строк, а второй - для уменьшения столбцов.
В отличие от предыдущего ответа, на этот раз я буду использовать строковый массив для выполнения этого комментария от вас:
Забыл упомянуть, что таким образом он будет работать и для писема также.
static String[][] fillArray(int rows, int columns){
char ch = 'A';
String[][] matrix = new String[rows][columns];
int square = Math.min(rows, columns);
for(int i = 0; i < square; i++){
String curr = String.valueOf(ch);
for(int r = 0; r <= i ; r++){
matrix[r][i] = curr;
}
for(int c = i-1; c >= 0; c--){
matrix[i][c] = curr;
}
ch++;
}
return matrix;
}
Вызов вышеописанного метода, например, с аргументами 4x5
public static void main(String[] args) {
String[][] filled = fillArray(4,5);
for(String[] row: filled){
System.out.println(Arrays.toString(row));
}
}
приведет к
[A, B, C, D, null]
[B, B, C, D, null]
[C, C, C, D, null]
[D, D, D, D, null]
Теперь давайтепосмотрите на игнорируемую область, которая все еще заполнена null
, то есть случаи, когда rows > columns or rows < columns
. Для простоты я заполню эту область с помощью *
.
static String[][] fillArray(int rows, int columns){
char ch = 'A';
String[][] matrix = new String[rows][columns];
int square = Math.min(rows, columns);
for(int i = 0; i < square; i++){
String curr = String.valueOf(ch);
for(int r = 0; r <= i ; r++){
matrix[r][i] = curr;
}
for(int c = i-1; c >= 0; c--){
matrix[i][c] = curr;
}
ch++;
}
ch = '*';
if (rows > columns) {
for (int i = square; i < rows; i++) {
for (int j = 0; j < columns; j++) {
matrix[i][j] = String.valueOf(ch);
}
}
}
if (rows < columns) {
for (int i = square; i < columns; i++) {
for (int j = 0; j < rows; j++) {
matrix[j][i] = String.valueOf(ch);
}
}
}
return matrix;
}
Вызов fillArray (4,6)
public static void main(String[] args) {
String[][] filled = fillArray(4,6);
for(String[] row: filled){
System.out.println(Arrays.toString(row));
}
}
должен теперь привести к:
[A, B, C, D, *, *]
[B, B, C, D, *, *]
[C, C, C, D, *, *]
[D, D, D, D, *, *]
Этот пост стал длиннее, чем я думал. Но я надеюсь, что это довольно легко понять.