головоломка — C ++: возврат строки & amp; столбец заданного числа в матрице, функция

начинающий программист C ++ здесь (с использованием Visual Studio 2013).

Я хотел бы написать функцию, в которую я могу вставить число, и оно проверит, имеет ли это число ноль непосредственно над, под или рядом с ним, а затем вернет позицию нуля.

Например, если я хочу проверить окружение числа 2, которое находится в (1, 1), я хочу, чтобы оно возвратило (если есть) положение 0, которое находится в (1, 2). Как бы я поступил так? Должен ли я вместо этого использовать матричное поле (например, [] [])?

Функция будет использоваться для определения, может ли число, скажем, 2, поменять местами с другим числом (в моем случае это ноль), и это можно сделать только в том случае, если ноль находится прямо над, под или рядом с ним.

3 5 6 8
9 2 0 7
1 8 9 3
1 3 5 7

Пока это мой код, он только создает векторную матрицу (извините, если я использую неправильные термины), рандомизирует число от 1 до 15 и помещает его в (строку, столбец), а затем заменяет число в selected (row, 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;
}
}

Я пытался найти в Интернете что-то похожее, но я не нашел его, я уверен, что оно есть, но я просто не знаю, как правильно сформулировать поисковый вопрос.

0

Решение

Да, давайте попробуем использовать 2d массив (который имитирует матрицу, int [] [] относится к 2d матрице).

Следуя вашему примеру: вы хотите проверить, равны ли соседние записи нулю. Давайте использовать ваш пример (1,1) как 2.

Ряд операторов if может быть вашим решением.

Пусть matrix будет целочисленной 2d матрицей некоторого размера.

если матрица [1] [2] равна 0, то
возврат позицииRight
если матрица [1] [0] равна 0, то
возвращение positionLeft
если матрица [0] [1] равна 0, то
возврат позиции
если матрица [2] [1] равна 0, то
возвращение positionDown

Так как вы проверяете только индексы, находящиеся в непосредственной близости, 4, если операторы не так уж плохи для проверки соседнего нуля.

0

Другие решения

Я думаю, что это может быть решением, хотя оно и кажется немного примитивным.

Поскольку я не мог понять, как вернуть два значения, я только что сделал две функции, одна из которых возвращает позицию строки, одна — столбца для нуля.

Я также столкнулся с проблемой, когда она выходит за пределы матрицы, так как у меня была матрица 4×4, я вместо этого сделал ее 6×6 и окружил ее рамкой -1 с.

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;
}
0

По вопросам рекламы [email protected]