Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Наставьте на путь истинный (работа с матрицей) / 14 сообщений из 14, страница 1 из 1
13.04.2014, 13:41
    #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
13.04.2014, 14:00
    #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
14.04.2014, 13:56
    #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
14.04.2014, 15:51
    #38614373
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
Могу помочь вам завтра, сейчас пишу с телефона. И компьютер нельзя включить (
...
Рейтинг: 0 / 0
14.04.2014, 15:52
    #38614374
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
Оформите код нормально. Границы for неправильные
...
Рейтинг: 0 / 0
14.04.2014, 15:54
    #38614379
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
Подумайте, может быть есть не алгоритм в лоб, а более красивый :-)
...
Рейтинг: 0 / 0
15.04.2014, 03:04
    #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
15.04.2014, 03:05
    #38614914
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
Ну и конечно по нормальному всё это переписать через указатели.
...
Рейтинг: 0 / 0
15.04.2014, 03:40
    #38614923
rya
rya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
SashaMercury,

Спасибо большое,что не прошли мимо.Огромное спасибо !
...
Рейтинг: 0 / 0
15.04.2014, 04:12
    #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
15.04.2014, 04:30
    #38614929
rya
rya
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
SashaMercury,Вы не представляете как Вы мне помогли...только начал изучать си... алгоритм понимаю, а написать не могу...спасибо большое!
...
Рейтинг: 0 / 0
15.04.2014, 04:34
    #38614932
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
rya, не за что C:
Только проверьте всё, а то мало-ли, ошибся вдруг.
Для изучения вам лучше всего подойдёт K&R Язык С ;)
...
Рейтинг: 0 / 0
15.04.2014, 07:29
    #38614949
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наставьте на путь истинный (работа с матрицей)
ryaSashaMercury,Вы не представляете как Вы мне помогли...только начал изучать си... алгоритм понимаю, а написать не могу...спасибо большое!

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


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