我的任務是讓用戶輸入數字 n,然后輸入維度為 n*n 的矩陣形式。然后編程,使對角線為零,對角線上方的數字必須是正數(1,2,...,n),對角線下方的數字必須是負數(-1,-2,...,-n) )。經過 8 個小時的思考,我成功地制作了矩陣,但是對角線下方的數字必須為負數為正數。我找不到問題出在哪里。
輸入樣本:
Enter n: 5
Matrix:
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0
我的輸出:
Enter n: 5
Matrix:
0 1 2 3 4
1 0 1 2 3
2 1 0 1 2
3 2 1 0 1
4 3 2 1 0
我的代碼:
#include <bits/stdc .h>
using namespace std;
void solve(long long n)
{
long long array1[n - 1][n - 1], array2[n][n];
for (long long i = 0; i < n - 1; i)
array1[0][i] = i 1;
for (long long i = 1; i < n - 1; i)
for (long long j = 0; j < n - 1; j)
array1[i][j]
= array1[i - 1][(j 1) % (n - 1)];
for (long long i = 0; i < n - 1; i)
for (long long j = 0; j < n - 1; j)
array2[i][j] = array1[i][j];
for (long long i = 0; i < n; i)
array2[i][n - 1] = array2[n - 1][i] = 0;
for (long long i = 0; i < n; i) {
long long t0 = array2[i][i];
long long t1 = array2[i][n - 1];
swap(array2[i][i], array2[i][n - 1]);
array2[n - 1][i] = t0;
}
for (long long i = 0; i < n; i) {
for (long long j = 0; j < n; j)
cout << array2[i][j] << " ";
cout << endl;
}
}
int main()
{
long long n = 5;
solve(n);
return 0;
}
uj5u.com熱心網友回復:
根據我的評論,關鍵是找到可以利用的模式。我們還將遠離 C 陣列,這不僅是因為關于推薦向量的 SO 模因,即使它不相關,而且因為它們實際上是這個用例的更好的資料結構。
您最終會使用 VLA,或可變長度陣列。它們不是 C 的一部分,而是 C 的可選部分。對 VLA 的支持可能隨時消失,而且最重要的是,正如另一條評論中提到的那樣,它們對堆疊不安全。
在我們進入解決方案之前,我應該解決您的前兩行代碼。每行都鏈接到一個答案,告訴您為什么它們不好:
#include <bits/stdc .h>
using namespace std;
那么,這個神奇的圖案是什么?我選擇單獨查看一行。在通過方形二維陣列進行的典型嵌套 for 回圈迭代中,當行號等于列號時出現對角線。對角線落在matrix[i][i]ifi是用于迭代行的變數上。
該模式用于檢查一行的值。左邊的值應該是負的,右邊的值應該是正的。不僅如此,這些值應該是與對角線元素的距離。
好吧,如果我j用作我的列計數器,值就像j - i. 考慮第二行,i = 1。
-1 0 1 2 3
這是第 1 行,[1][1]零元素也是。在[1][0], j - i== -1 等。找到模式極大地簡化了您需要撰寫的代碼。這是一個實作:
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <vector>
void solve(const long long n) {
// Declare and zero-initialize
std::vector<std::vector<int>> v(n, std::vector<int>(n, 0));
// Fill array
for (std::size_t i = 0; i < v.size(); i) {
for (std::size_t j = 0; j < v[i].size(); j) {
v[i][j] = static_cast<int>(j) - static_cast<int>(i);
}
}
// Find length of biggest number, v[0][n - 1]; for printing purposes
int largest = v[0][n - 1];
int numLength = 0;
while (largest != 0) {
numLength;
largest /= 10;
}
// Print array
for (auto i : v) {
for (auto j : i) {
std::cout << std::setw(numLength 2) << j << ' ';
}
std::cout << '\n';
}
}
int main(int argc, char* argv[]) {
if (argc != 2) return 1;
long long n = std::atoi(argv[1]);
solve(n);
}
示例輸出:
? ./a.out 5
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0
? ./a.out 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12
-3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11
-4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10
-5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9
-6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8
-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
-9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5
-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4
-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3
-12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1
-14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0
solve()當我們能夠利用一個模式而不是暴力破解它時,這個函式會變得多么簡單,這是非常明顯的。
uj5u.com熱心網友回復:
只需在嵌套的 for 回圈中放置一個條件即可檢查 index_of_row 大于 index_of_column 的元素并使它們為負。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329724.html
下一篇:DBT-以數字為變數的回圈問題
