powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наставьте на путь истинный (работа с матрицей)
14 сообщений из 14, страница 1 из 1
Наставьте на путь истинный (работа с матрицей)
    #38613504
rya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rya
Гость
Сразу прошу прощения за "говнокод", только начал изучать си.

Задача: Есть матрица NxN. Она заполнена числами от 0 до 2 рандомным образом. Если в (любых)диагоналях есть три и более (параметр) подряд одинаковых чисел,то мы это фиксируем в массиве.(нужно найти кол-во таких комбинаций, для каждого числа)

Пример:

0 1 0 2 1
1 0 1 1 1
2 1 0 0 2
2 2 1 1 1

тогда в новом массиве A[0]++


2 1 1 2 2
2 0 2 1 2
1 2 0 1 0
0 1 2 0 1
2 2 0 1 2

тогда в новом массиве A[2]++ и A[0]++


Пусть дана матрица game[N][N] заполненная числами от 0 до 2.
Сама проверка диагональных элементов:
p - параметр ( сколько элементов одинаковых должно быть подряд )
A[0...2] -массив, который фиксирует совпадения
А1[0...2] - вспомогательный массив


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>

<
....
генерируем рандомную матрицу
....
>

for(int i=0;i<N-1;i++)   /*элементы вдоль побочной диагонали*/
	{
		for(int j=N-1;j>0;j--)
	      {
		           
	      for(int h=1;h>=p-1;h++)
		  {
		if(game[i][j]==game[i+h][j-h])
		 A1[game[i][j]]++;
		
		for (int k=0;k<3;k++)
			if (A1[k]==p-1)
			A[k]++;
		  }
	       }
		
	}
	/*вдоль главной диагонали */
    	for(int i=0;i<N-1;i++)
	{
	for(int j=0;j<N-1;j++)
          {           
	      for(int h=1;h>=p-1;h++)
		  {
		if(game[i][j]==game[i+h][j+h])
				  A1[game[i][j]]++;
		
		for (int k=0;k<3;k++)
	          if (A1[k]==p-1)
		      A[k]++;
		   }
	   }
	}


Видимо я чего то не понимаю, но вся это проверка не работает.
Подскажите, где я неправильно мыслю.
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38613515
rya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rya
Гость
Исправил код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
 
<
....
генерируем рандомную матрицу
....
>
int A[3] = {0,0,0}, A1[3];

for(int i=0;i<N-1;i++)   /*элементы вдоль побочной диагонали*/
    {
        for(int j=N-1;j>0;j--)
          {
                   
          for(int h=1;h>=p-1;h++)
          {
        if(game[i][j]==game[i+h][j-h])
         A1[game[i][j]]++;
        
        for (int k=0;k<3;k++)
            if (A1[k]==p-1)
            A[k]++;
             }
           }
        
    }
    /*вдоль главной диагонали */
        for(int i=0;i<N-1;i++)
    {
    for(int j=0;j<N-1;j++)
          {           
          for(int h=1;h>=p-1;h++)
          {
        if(game[i][j]==game[i+h][j+h])
                  A1[game[i][j]]++;
        
        for (int k=0;k<3;k++)
              if (A1[k]==p-1)
              A[k]++;
           }
       }
    }
 for (int k=0;k<3;k++)
        printf("A[%d]=%d\n",k,A[k]);
 
    return 0;
}
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614185
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ryaВидимо я чего то не понимаю, но вся это проверка не работает.
Подскажите, где я неправильно мыслю.

Много где.
Как минимум:
0. for(int h=1;h>=p-1;h++) ни разу не выполняется из-за h>=p-1, надо уж <=.
1. Будет выход за границы матрицы в game[i+h][j-h] и game[i+h][j+h].
2. Надо иногда обнулять А1.
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614373
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу помочь вам завтра, сейчас пишу с телефона. И компьютер нельзя включить (
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614374
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оформите код нормально. Границы for неправильные
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614379
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумайте, может быть есть не алгоритм в лоб, а более красивый :-)
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614913
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При решении в лоб можно использовать следующий алгоритм.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
#include <stdlib.h>
#include <stdio.h>

const int n = 15;
const int deep = 3;

int main(int argc, char* argv[])
{
	int a[n][n];
	int b[2][3] = { { 0, 1, 2 }, { 0, 0, 0 } };
	
	//Заполняем главный массив
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = rand() %3;
			printf("%i ", a[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	//Поиск 
	for (int i = 0; i <= n - deep; i++)
	{
		for (int j = 0; j <= n - deep; j++)
		{
			int temp = deep-1;
			while (temp > 0) 
			{
				if (a[i][j] != a[i + temp][j + temp]) break;
				temp--;
			}
			if (temp == 0)
			{
				printf("%i %i \n", i, j);
				b[1][a[i][j]]++;
			}
		}
	}

	//Вывод на экран результата
	printf("\nresult: \n");
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%i ", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}



Нужно дописать аналогичную часть для поиска в другую сторону, либо придумать другой алгоритм ;)
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614914
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и конечно по нормальному всё это переписать через указатели.
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614923
rya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rya
Гость
SashaMercury,

Спасибо большое,что не прошли мимо.Огромное спасибо !
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614928
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придумайте более оптимальный алгоритм, если он возможен :)
Ниже код в первом приближении для всех диагональных элементов, возможно нужно отшлифовать. Ну и указатели на ваш вкус

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
#include <stdlib.h>
#include <stdio.h>

const int n = 5;
const int deep = 3;

int main(int argc, char* argv[])
{
	int a[n][n];
	int b[2][3] = { { 0, 1, 2 }, { 0, 0, 0 } };
	//Заполняем главный массив
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = rand() %3;
			printf("%i ", a[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	//Поиск 
	for (int i = 0; i <= n - deep; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (j <= n - deep)
			{
				int temp = deep - 1;
				while (temp > 0)
				{
					if (a[i][j] != a[i + temp][j + temp]) break;
					temp--;
				}
				if (temp == 0) b[1][a[i][j]]++;
			}
			if (j >= deep-1) //всё правильно, именно if, а не else if
			{
				int temp = deep - 1;
				while (temp > 0)
				{
					if (a[i][j] != a[i + temp][j - temp]) break;
					temp--;
				}
				if (temp == 0) b[1][a[i][j]]++;
			}
		}
	}

	//Вывод на экран результата
	printf("\nresult: \n");
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("%i ", b[i][j]);
		}
		printf("\n");
	}
	return 0;
}
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614929
rya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
rya
Гость
SashaMercury,Вы не представляете как Вы мне помогли...только начал изучать си... алгоритм понимаю, а написать не могу...спасибо большое!
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614932
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rya, не за что C:
Только проверьте всё, а то мало-ли, ошибся вдруг.
Для изучения вам лучше всего подойдёт K&R Язык С ;)
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614949
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ryaSashaMercury,Вы не представляете как Вы мне помогли...только начал изучать си... алгоритм понимаю, а написать не могу...спасибо большое!

Фактически ты его спас от армии...
...
Рейтинг: 0 / 0
Наставьте на путь истинный (работа с матрицей)
    #38614967
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
;)
А есть ли более красивый и быстрый алгоритм ?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наставьте на путь истинный (работа с матрицей)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]