NaumanMalik Ответов: 3

Я пробовал это сделать, но не могу понять, как это сделать с 2D C++


Напишите программу на языке C++, которая считывает двумерный целочисленный массив из файла "data.txt". Файл содержит размер строки и столбца, а также данные массива. Теперь считайте целочисленный массив от пользователя. Ваша задача состоит в том, чтобы найти массив ID в 2D массиве, если массив ID присутствует в 2D массиве return true else false.
Пример 1
data.txt
4 4
11 12 13 14
25 26 27 28
39 30 31 32
43 44 45 46
Массив: 25 26 27 28
Правда
Пример 2
data.txt
4 4
11 12 13 14
25 26 27 28
39 30 31 32
43 44 45 46
Массив: 13 14 25 26
Правда
Пример 3
data.txt
4 4
11 12 13 14
25 26 27 28
39 30 31 32
43 44 45 46
Массив: 13 15 64 45
Ложный

Что я уже пробовал:

#include<iostream>
#include<fstream>
using namespace std;

bool Find_1D_into_2D(int **p, int q, int r)
{
	int *Arr = new int[q], i = 0;
	bool Found = true;
	cout << "Enter Elenments of 1D array to find:\n";
	for(; i < q; i++)
	{
		cin >> Arr[i];
	}
	for(int j = 0,l=0; j < q; j++)
	{
		for(int k = 0; k < r; k++)
		{
			Found = false;
			if(p[j][k]==Arr[l])
			{
				Found = true; l++;
			}
			else
			{
				Found = false; l = 0;
			}
		}
		if(Found&&l == i)
		{
			break;
		}
	}
	return Found;
}
int main()
{
	int Row = 0, Column = 0;
	ifstream Read("Sample.txt");
	Read >> Row >> Column;
	Read.close();
	int **arr = new int *[Row] {};
	for(int i = 0; i < Row; i++)
	{
		arr[i] = new int[Column] {};
	}
	cout << "Enter Elements of 2D array: " << endl;
	for(int i = 0; i < Row; i++)
	{
		for(int j = 0; j < Column; j++)
		{
			cin >> arr[i][j];
		}
	}
	if(Find_1D_into_2D(arr, Row, Column))
	{
		cout << "True";
	}
	else
	{
		cout << "False";
	}
	cout << endl;
	return 0;
}

Richard MacCutchan

Вы должны сказать нам, в чем проблема (снова). Если вы не знаете, как создать 2D-массив, есть много примеров, которые Google найдет для вас. Если это что - то другое, то нам нужны детали. Кстати, я не совсем понимаю, почему вы начали новый вопрос, когда еще не закончили работу над ним. Система управления аукционами | C++ | функции, указатели, динамические или без утечки памяти[^].

NaumanMalik

он должен читать строку только из прямого направления, а не из столбца... любить
11 12 13 14
15 16 17 18
19 20 21 22
23 24 25 26
1D ARR: 11 12 13 14 TRUE
если я ввожу 1D массив: 13 14 из первой строки и 15 16 из второй строки, но они находятся друг за другом в строке, как 13 14 15 16 в 2D массиве: тогда это правда

3 Ответов

Рейтинг:
12

NaumanMalik

Решение вышеуказанной проблемы

#include<iostream>
#include<fstream>
using namespace std;

bool Find_1D_into_2D(int **p, int q, int r)
{
	int *Arr = new int[q], i = 0;
	bool Found = true;
	cout << "Enter Elenments of 1D array to find:\n";
	for(; i < q; i++)
	{
		cin >> Arr[i];
	}
	for(int j = 0,l=0; j < q; j++)
	{
		for(int k = 0; k < r; k++)
		{
			if(Found&&l == i)
			{
				break;
			}
			Found = false;
			if(p[j][k]==Arr[l])
			{
				Found = true; l++;
			}
			else
			{
				Found = false; l = 0;
			}
		}
		
	}
	return Found;
}
int main()
{
	int Row = 0, Column = 0;
	ifstream Read("Sample.txt");
	Read >> Row >> Column;
	Read.close();
	int **arr = new int *[Row] {};
	for(int i = 0; i < Row; i++)
	{
		arr[i] = new int[Column] {};
	}
	cout << "Enter Elements of 2D array: " << endl;
	for(int i = 0; i < Row; i++)
	{
		for(int j = 0; j < Column; j++)
		{
			cin >> arr[i][j];
		}
	}
	if(Find_1D_into_2D(arr, Row, Column))
	{
		cout << "True";
	}
	else
	{
		cout << "False";
	}
	cout << endl;
	return 0;
}


Patrice T

Это решение или ваш новый код с проблемами ?

NaumanMalik

решение моей собственной проблемы

Рейтинг:
0

OriginalGriff

Сначала вы должны решить, что означает "присутствует в".
Означает ли это, что строка содержит его:

123 

in

456
123
789
Или колонна?
123

in
417
528
639
Или как? А как насчет диагоналей? Только вперед, или обратный отсчет? А что, если она тянется на два ряда?
123

in

451
236
789


Когда вы решите это, вы можете начать искать его.

Поиск последовательности в более длинной последовательности довольно прост:
1) Установите переменную в начало последовательности, которую вы ищете: вызовите ее seeker
2) петля через длинную последовательность, значение за значением.
3) соответствует ли значение текущему элементу seeker?
3.1) если это так, продвинутый искатель. Является ли Искатель в конце?
3.1.1) если это так, верните true - вы его нашли.
3.1.2) если нет, продолжайте цикл.
3.2) если нет, установите seeker вернемся к началу последовательности поиска.
4) не существует, возвращает false.


Попробуйте сделать это вручную, и вы поймете, что я имею в виду - вы должны быть в состоянии реализовать его.


NaumanMalik

Да, он должен читать строку только из прямого направления, а не из столбца... любить
11 12 13 14
15 16 17 18
19 20 21 22
23 24 25 26
1D ARR: 11 12 13 14 TRUE
если я ввожу 1D массив: 13 14 из первой строки и 15 16 из второй строки, но они находятся друг за другом в строке, как 13 14 15 16 в 2D массиве: тогда это правда

NaumanMalik

я пробую на бумаге то, что вы предложили

Рейтинг:
0

steveb

В вашем

Find_1D_into_2D
не забудь об этом:

где:
int *Arr = new int[q];


за этим следует

delete [] Arr;


NaumanMalik

окей