所以我试图让一个数组类可以让你添加一个数字,并且添加函数会将该数字放置到一个数组中,使用下列条件:数组行和列必须按升序编号排序。所以在C++自定义类中自我排序数组的排序函数
是细的,而
失败,如图4> 2和3> 2,但
is accept能够的
赋值是模糊的,只要满足约束条件,它是否使数组成为第一个或第三个并不重要。我通过简单地写出一个案例列表并试图关注每个案例来完成我的添加功能。当数组初始化时,它会将INTEGER_MAX放置在每个位置以进行占位和评估。我不确定这是评估的顺序还是什么,但有时它会在INTEGER_MAX或其他顺序下添加一个数字。我一直在研究这个问题,并且对寻求帮助犹豫不决,但我认为用一双新鲜的眼睛可能会更容易。我将为函数和类添加代码,我不知道是否/应该如何包含依赖类以允许其他人编译代码?我是新手,有点不舒服,所以只需要忍耐一下,我会提供任何需要帮助的信息。谢谢!
这里的add()函数本身:
void add(int i) {
//THIS NEEDS TO BE FIXED ITS GOING TO THE WRONG PLACES
if (matrix[row - 1][col - 1] != INT_MAX){ //if the last element in the VNT is full
cout<<"VNT is full!"<<endl;
}
else {
matrix[row - 1][col - 1] = i;
//cout << "matrix["<<row-1<<"]["<<col-1<<"] = " <<matrix[row - 1][col - 1]<<endl;
int r = row - 1;
int c = col - 1;
while (true) {
if (r == 0 && c == 0) //no neighbor left, no neighbor above, correct position
break;
else if (c == 0) { //no neighbor left
if (matrix[c][r-1] > i) { //if above is larger, swap
swap (r, c, r-1, c);
r--; //decrement row to go through stability check again
}
else //above is smaller, break
break;
}
else if (r == 0) { //no neighbor above
if (matrix[c-1][r] > i) { //if left is larger, swap
swap (r, c, r, c-1);
c--; //decrement column to go through stability check again
}
else //left is smaller, break
break;
}
else if (matrix[r][c-1] < i && matrix[r-1][c] < i) //left and above are both smaller, right position
break;
else if (matrix[r][c-1] > i && matrix[r-1][c] > i) { //both left and above are potential candidates for switch
if (matrix[r][c-1] >= matrix[c][r-1]) { //if left candidate is larger than top candidate, swap with that to preserve column
swap (r, c, r, c-1);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r<<"]["<<c-1<<"]"<<endl;
c--; //decrement column to go through stability check again
}
else { //otherwise swap with neighbor above
swap (r, c, r-1, c);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r-1<<"]["<<c<<"]"<<endl;
r--; //decrement row to go through stability check again
}
}
else if (matrix[r][c-1] > i) { //only left neighbor is larger, swap left
swap (r, c, r, c-1);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r<<"]["<<c-1<<"]"<<endl;
r--;
}
else if (matrix[r-1][c] > i) { //only the above neighbor is larger, switch with that
swap (r, c, r-1, c);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r-1<<"]["<<c<<"]"<<endl;
c--;
}
}
}
}
,然后这里是上下文较大的类文件(请让我知道如果有更多需要):
#include <cmath>
#include <climits>
#define main poop
#include "SA.cpp"
#include "safeMatrix.cpp"
using namespace std;
#undef main
//friend ostream& operator<< (ostream& os, VNT v);
class VNT {
private:
SafeMatrix <int> matrix;
int row;
int col;
public:
VNT (int r, int c) : matrix (r, c) { //2 param constructor
//cout << "r = " << r << " c = " << c << endl;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
//cout << "i = " << i << " j = " << j;
matrix[i][j] = INT_MAX;
}
cout << endl;
}
row = r; //initialize the rows and cols vars to hold the SIZE of the array !POSSIBLE OFF BY 1 ERRORS!
col = c;
}
~VNT() { //destructor
cout << "VNT Destructor called\n";
}
void add(int i) {
//THIS NEEDS TO BE FIXED ITS GOING TO THE WRONG PLACES
if (matrix[row - 1][col - 1] != INT_MAX){ //if the last element in the VNT is full
cout<<"VNT is full!"<<endl;
}
else {
matrix[row - 1][col - 1] = i;
//cout << "matrix["<<row-1<<"]["<<col-1<<"] = " <<matrix[row - 1][col - 1]<<endl;
int r = row - 1;
int c = col - 1;
while (true) {
if (r == 0 && c == 0) //no neighbor left, no neighbor above, correct position
break;
else if (c == 0) { //no neighbor left
if (matrix[c][r-1] > i) { //if above is larger, swap
swap (r, c, r-1, c);
r--; //decrement row to go through stability check again
}
else //above is smaller, break
break;
}
else if (r == 0) { //no neighbor above
if (matrix[c-1][r] > i) { //if left is larger, swap
swap (r, c, r, c-1);
c--; //decrement column to go through stability check again
}
else //left is smaller, break
break;
}
else if (matrix[r][c-1] < i && matrix[r-1][c] < i) //left and above are both smaller, right position
break;
else if (matrix[r][c-1] > i && matrix[r-1][c] > i) { //both left and above are potential candidates for switch
if (matrix[r][c-1] >= matrix[c][r-1]) { //if left candidate is larger than top candidate, swap with that to preserve column
swap (r, c, r, c-1);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r<<"]["<<c-1<<"]"<<endl;
c--; //decrement column to go through stability check again
}
else { //otherwise swap with neighbor above
swap (r, c, r-1, c);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r-1<<"]["<<c<<"]"<<endl;
r--; //decrement row to go through stability check again
}
}
else if (matrix[r][c-1] > i) { //only left neighbor is larger, swap left
swap (r, c, r, c-1);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r<<"]["<<c-1<<"]"<<endl;
r--;
}
else if (matrix[r-1][c] > i) { //only the above neighbor is larger, switch with that
swap (r, c, r-1, c);
cout << "Swapping a["<<r<<"]["<<c<<"] with a["<<r-1<<"]["<<c<<"]"<<endl;
c--;
}
}
}
}
int getMin() { //removes the first element and then resort the matrix
int value;
if (matrix[0][0] == INT_MAX){ // if the VNT is empty it will output this message but
cout<<"VNT is empty"<<endl;
return -1;
}
else {
value = matrix[0][0]; // value to be returned
matrix[0][0] = INT_MAX; // set the first element to INT_MAX
int r = 0;
int c = 0;
while (r < row || c < col) {
if (matrix[r][c] > matrix[r+1][c] && matrix[r][c] > matrix[r][c+1]) { //if both the element to the right and below are candidates
if (matrix[r][c+1] < matrix[r+1][c]) { //if swapping with left wont invalidate the column, do that
swap(r, c, r, c+1);
c++;
}
else { //otherwise swap with bottom
swap(r, c, r+1, c);
r++;
}
}
else if (matrix[r][c] > matrix[r][c+1]) {
swap(r, c, r, c+1);
c++;
}
else if (matrix[r][c] > matrix[r+1][c]) {
swap(r, c, r+1, c);
r++;
}
else
break;
}
}
return value; //scope?!?
}
void sort(int k[], int size) {
if (size > row*col)
cout << "Too many elements for the VNT"<< endl;
else {
for (int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
matrix[i][j] = INT_MAX; //set every element in the VNT to INT_MAX
}
}
for(int i = 0; i < size; i++){
add(k[i]); // will use the member function to add each element to the VNT
}
}
}
void swap (int r1, int c1, int r2, int c2) {
int temp = matrix[r1][c1];
matrix[r1][c1] = matrix[r2][c2];
matrix [r2][c2] = temp;
}
bool find (int i) {
for (int r = 0; r < row; r++) {
for (int c = 0; c < col; c++) {
if (matrix[r][c] == i)
return true;
// else if (matrix[r][c] > i)
// return false;
}
}
return false;
}
friend ostream& operator<< (ostream& os, VNT v);
};
ostream& operator<< (ostream& os, VNT v) {
for (int i = 0; i < v.row; i++) {
for (int j = 0; j < v.col; j++) {
if (v.matrix[i][j] == INT_MAX)
os << "*" << " ";
else
os << v.matrix[i][j] << " ";
}
os << endl;
}
return os;
}
int main(){
VNT a(5,5);
cout << a;
VNT b(3,3);
cout << b;
b.add(1);
b.add(5);
//cout << a.getMin();
//a.add(1);
//cout << b;
//b.add(10);
cout << b;
b.add(2);
b.add(3);
cout << b;
b.add(10);
b.add(7);
b.add(11);
cout << b;
cout << b.find(1)<<endl;
VNT m(3,5);
cout << m;
//cout << c;
};
现在,对我来说,对于矩阵b的代码的输出为:
1 3 *
5 10 *
(*代表INTEGER_MAX)
希望我格式化它的权利,在此先感谢!
感谢你的洞察(甚至是斜向!)!我甚至没有这样想过,但是这比我试图交换它的无数案件要容易得多,更加平易近人。 – user1048834