начинающий программист C++ (используя Visual Studio 2013).
Я хотел бы написать функцию, в которой я могу вставить номер, и он будет проверять, имеет ли это число нуль непосредственно выше, ниже или рядом с ним, а затем возвращает позицию нуля.
Например, если я хочу проверить окружение числа 2, которое находится в (1, 1), я хочу, чтобы он возвращал (если есть) позицию 0, которая находится на (1, 2). Как мне это сделать? Должен ли я использовать поле матрицы вместо (int a [] [], например)?
Функция будет использоваться, чтобы определить, может ли число, скажем, 2, обмениваться местами с другим номером (ноль в моем случае), и это может быть сделано только в том случае, если ноль находится непосредственно выше, ниже или рядом с ним.
3 5 6 8
9 2 0 7
1 8 9 3
1 3 5 7
Это мой код до сих пор, он создает только векторную матрицу (извините, если я использую неправильные термины), рандомизирует число от 1 до 15 и помещает его в (row, col), а затем заменяет число в (строка, col) с нулем с функцией set_zero.
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <vector>
using namespace std;
void set_zero(int row, int column, vector<vector<int>>& v){
v[row][column] = 0;
}
void scan_zero(vector<vector<int>>& v){
}
int _tmain(int argc, _TCHAR* argv[])
{
const int x = 4;
vector<vector<int>> v(x, vector<int>(x));
for (int i = 0; i < x; i++){
for (int j = 0; j < x; j++){
v[i][j] = rand() % 15 + 1;
}
}
set_zero(1, 2, v);
for (int i = 0; i < x; i++){
for (int j = 0; j < x; j++){
cout << setw(3) << v[i][j] << " ";
}
cout << endl;
}
}
Я пробовал искать в Интернете что-то похожее, но я его не нашел, я уверен, что он есть, но я просто не знаю, как правильно сформулировать вопрос поиска.
Я думаю, что это может быть решением, но это немного примитивно.
Поскольку я не мог понять, как вернуть два значения, я просто сделал две функции, один возвращал позицию строки, один из столбцов для нуля.
Я также столкнулся с проблемой, когда она выходит за пределы матрицы, поэтому, поскольку у меня была матрица 4x4, я вместо этого сделал ее 6x6 и окружил ее рамкой -1s.
int scan_zero_r(int r, int c, vector<vector<int>>& v){
int l = r + 1, k = r - 1;
if (v[l][c] == 0)
return l;
if (v[k][c] == 0)
return k;
else
return r;
}
int scan_zero_c(int r, int c, vector<vector<int>>& v){
int l = c + 1, k = c - 1;
if (v[r][l] == 0)
return l;
if (v[r][k] == 0)
return k;
else
return c;
}
Да, попробуйте использовать 2d-массив (который имитирует матрицу, int a [] [] относится к матрице 2d).
Следуя вашему примеру: вы хотите проверить, равны ли соседние записи. Пусть ваш пример (1,1) равен 2.
Ряд утверждений if может быть вашим решением.
Пусть матрица является целочисленной 2d-матрицей некоторого размера.
если матрица [1] [2] равна 0, тогда return positionRight, если матрица [1] [0] равна 0, тогда return positionLeft, если матрица [0] [1] равна 0, тогда верните позициюUp, если матрица [2] [1] равна 0, тогда return positionDown
Поскольку вы проверяете только индексы непосредственно рядом, операторы 4 if не так плохо анализируют для смежного нуля.