Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с алгоритмом

32K
24 октября 2011 года
LawManiak
76 / / 24.10.2011
Есть задание:
"Осуществить циклический сдвиг элементов квадратной матрицы размером М х N вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него — в последнюю строку справа налево, и: нее — в первый столбец снизу вверх, из него — в первую строку; для остальных: элементов — аналогично."

Помогите составить алгоритм, код могу и сам написать по алгоритму, но никак не могу сообразить как это движение реализовать...

Пишу в VS 2010 C#

Как я понял движение в матрице происходит примерно так:
316
24 октября 2011 года
Alm3n
889 / / 29.05.2009
i:0 по j от i до n-1 сдвигать вправо
j:n по i от 0 до n-1 сдвигать вниз
i:n по j от i до 1 сдвигать влево
j:0 по i от n до 1 сдвигать вверх
Это для первого круга. Если подумать, то константы можно заменить переменными и применить алгоритм к любому кругу.
32K
24 октября 2011 года
LawManiak
76 / / 24.10.2011
так-то да, мне бы в развернутом виде алгоритм, а может даже лучше и код...
Вот что у меня вышло...
for (int h = 0; h <= N / 2 - 1; h++)
for (int l = 0; l <= k; l++)
{
while (i==0 && j<N-1-h)
{tmp1 = b[i, j + 1];
b[i, j + 1] = b[i, j];
j++;}
while (i<N-1-h && j==N-1-h)
{tmp2 = b[i + 1, j];
b[i + 1, j] = b[i, j];
i++;}
while (i == N-1 - h && j > 0 + h)
{tmp1 = b[i, j - 1];
b[i, j - 1] = b[i, j];
j--;}
while (i > 0 + h && j == 0 + h)
{tmp2 = b[i - 1, j];
b[i - 1, j] = b[i, j];
i--;}
}

Я думал что потеряю только угловые элементы, а получилось, что почти все заполняется первым элементом...
316
24 октября 2011 года
Alm3n
889 / / 29.05.2009
Use [[COLOR="white"]x[/COLOR]code], Luke.
Код:
int[,] Arr;
            int n = 6;
            int i = 0, j = 0;
            int k = 0;
            Random rnd= new Random(15);
            Arr = new int[6, 6];

            for (i = 0; i < n; ++i)
            {
                for (j = 0; j < n; ++j)
                {
                    Arr[i, j] = rnd.Next(0,9);
                    Console.Write("{0} ", Arr[i, j]);
                }
                Console.WriteLine();
            }

            //---------------------------------------
             for ( k = 0; k < n*n/2; ++k )
             {
                i = k / n;
                j = k % n;
                if ( i <= j && j < n-1-i )
                {
                    int a = Arr[i,j];
                    Arr[i,j] = Arr[n-1-j,i];
                    Arr[n-1-j,i] = Arr[n-1-i,n-1-j];
                    Arr[n-1-i,n-1-j] = Arr[j,n-1-i];
                    Arr[j,n-1-i] = a;
                }
            }
            //-----------------------------------
             Console.WriteLine("\n\n\n");
             for (i = 0; i < n; ++i)
             {
                 for (j = 0; j < n; ++j)
                 {
                     Console.Write("{0} ", Arr[i, j]);
                 }
                 Console.WriteLine();
             }
                Console.ReadKey();
32K
24 октября 2011 года
LawManiak
76 / / 24.10.2011
Код конечно в какой-то мере соответствует картинке, но при этом не соответствует заданию...
Мне нужно что бы на определенное количество элементы сдвигались "змейкой" друг за другом по кругу...
316
24 октября 2011 года
Alm3n
889 / / 29.05.2009
Код работает в точности как изображено на рисунке. И сдвигается друг за другом. Либо ты что-то не досмотрел в том, как работает код, либо твоя картинка не отражает задания.
32K
24 октября 2011 года
LawManiak
76 / / 24.10.2011
Вот такой код получился, в итоге решил что проще реализовать через очередь.
Код:
private void button4_Click(object sender, EventArgs e)
        {
            int k = Convert.ToInt32(textBox6.Text);
            int i=0;
            int j=0;
            int r;
             
            //----Прохождение по "кольцам"-----
            for (int l = 0; l < N / 2; l++)
            {
                r = 4 * N - 4*(l+1); //Определение размерности очереди
                q = new Queue(r); //Выделение очереди


                //------Заполнение очереди-----

                for (i = 0+l; i <= N - 1-l; i++)
                {j = 0+l;
                 q.Enqueue(b[i, j]);}

                for (j = 1+l; j <= N - 2-l; j++)
                {i = N - 1-l;
                 q.Enqueue(b[i, j]);}

                for (i = N - 1-l; i >= 0+l; i--)
                {j = N - 1-l;
                 q.Enqueue(b[i, j]);}

                for (j = N - 2-l; j >= 1+l; j--)
                {i = 0+l;
                 q.Enqueue(b[i, j]);}

                //------------------------------


                //-------Сдвиг элементов--------

                for (int m = 0; m < k; m++)
                {int t = Convert.ToInt32(q.Dequeue());
                 q.Enqueue(t);}

                //-----------------------------


                //-Заполнение массива из очереди-

                for (i = 0 + l; i <= N - 1 - l; i++)
                {j = 0+l;
                 b[i, j]=Convert.ToInt32(q.Dequeue());}

                for (j = 1 + l; j <= N - 2 - l; j++)
                {i = N - 1-l;
                 b[i, j]=Convert.ToInt32(q.Dequeue());}

                for (i = N - 1 - l; i >= 0 + l; i--)
                {j = N - 1-l;
                 b[i, j]=Convert.ToInt32(q.Dequeue());}

                for (j = N - 2 - l; j >= 1 + l; j--)
                {i = 0+l;
                 b[i, j]=Convert.ToInt32(q.Dequeue());}

                //-------------------------------

                q.Clear();
            }
            //----------------------------------


            //-Заполнение DataGridView из массива-
                for (i = 0; i < N; i++)
                    for (j = 0; j < N; j++)
                        dataGridView1.Rows.Cells[j].Value = Convert.ToString(b[i, j]);
            //------------------------------------

        }


Принцип в том, что считываем внешний "круг" в очередь, "прокручиваем" очередь на нужное количество элементов, записываем обратно, "сужаем" круг и проделываем ещё раз и так пока не проходят все "круги". В итоге "прокручиваем" все "круги" на нужное нам количество элементов :) Вот такое хитрозапутанное задание...
316
25 октября 2011 года
Alm3n
889 / / 29.05.2009
[COLOR="white"]([/COLOR]-_-[COLOR="white"])[/COLOR]
89K
03 марта 2015 года
cliff123
2 / / 03.03.2015
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
int[,] Arr;
Console.WriteLine("n = ");
int n = int.Parse(Console.ReadLine());
Console.WriteLine("m = ");
int m = int.Parse(Console.ReadLine());
if (n <= 0||m <= 0)
{
Console.WriteLine("Uncorrect size");
Console.ReadKey();
return ;
}
int i = 0, j = 0;

Console.WriteLine("k = ");
int k = int.Parse(Console.ReadLine());
if (k <= 0 )
{
Console.WriteLine("Uncorrect size");
Console.ReadKey();
return;
}

Random rnd = new Random(55);
Arr = new int[n, m];

for (i = 0; i < n; ++i)
{
for (j = 0; j < m; ++j)
{
Arr[i, j] = rnd.Next(0, 9);
Console.Write("{0} ", Arr[i, j]);
}
Console.WriteLine();
}

//---------------------------------------
int[] a = new int[2 * n + 2 * m - 4];
int cur = 0;
for (i = 0; i < m; ++i)
a [cur++] = Arr[0, i];
for (i = 1; i < n; ++i)
a[cur++] = Arr[i, m - 1];
for (i = m - 2; i >= 0; --i)
a[cur++] = Arr[n - 1, i];
for (i = n - 2; i >= 1; --i)
a[cur++] = Arr[i, 0];

int c = 2 * n + 2 * m - 4;
cur = c - k;
for (i = 0; i < m; ++i)
Arr[0, i] = a[cur++ % c];
for (i = 1; i < n; ++i)
Arr[i, m - 1] = a[cur++ % c];
for (i = m - 2; i >= 0; --i)
Arr[n - 1, i] = a[cur++ % c];
for (i = n - 2; i >= 1; --i)
Arr[i, 0] = a[cur++ % c];

//-----------------------------------
Console.WriteLine("nn");
for (i = 0; i < n; ++i)
{
for (j = 0; j < m; ++j)
{
Console.Write("{0} ", Arr[i, j]);
}
Console.WriteLine();
}
Console.ReadKey();


}
}
}
89K
03 марта 2015 года
cliff123
2 / / 03.03.2015
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] Arr;
            Console.WriteLine("n = ");
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine("m = ");
            int m = int.Parse(Console.ReadLine());
            if (n <= 0||m <= 0)
            {
                Console.WriteLine("Uncorrect size");
                Console.ReadKey();
                return ;
            }
            int i = 0, j = 0;

            Console.WriteLine("k = ");
              int k = int.Parse(Console.ReadLine());
              if (k <= 0 )
              {
                  Console.WriteLine("Uncorrect size");
                  Console.ReadKey();
                  return;
              }
           
            Random rnd = new Random(55);
            Arr = new int[n, m];

            for (i = 0; i < n; ++i)
            {
                for (j = 0; j < m; ++j)
                {
                    Arr[i, j] = rnd.Next(0, 9);
                    Console.Write("{0} ", Arr[i, j]);
                }
                Console.WriteLine();
            }

            //---------------------------------------
            int[] a = new int[2 * n + 2 * m - 4];
            int cur = 0;
            for (i = 0; i < m; ++i)
                a   [cur++] = Arr[0, i];
            for (i = 1; i < n; ++i)
                a[cur++] = Arr[i, m - 1];
            for (i = m - 2; i >= 0; --i)
                a[cur++] = Arr[n - 1, i];
            for (i = n - 2; i >= 1; --i)
                a[cur++] = Arr[i, 0];
           
            int c = 2 * n + 2 * m - 4;
            cur = c - k;
            for (i = 0; i < m; ++i)
                Arr[0, i] = a[cur++ % c];
            for (i = 1; i < n; ++i)
                Arr[i, m - 1] = a[cur++ % c];
            for (i = m - 2; i >= 0; --i)
                 Arr[n - 1, i]  = a[cur++ % c];
            for (i = n - 2; i >= 1; --i)
                Arr[i, 0] = a[cur++ % c];

            //-----------------------------------
            Console.WriteLine("nn");
            for (i = 0; i < n; ++i)
            {
                for (j = 0; j < m; ++j)
                {
                    Console.Write("{0} ", Arr[i, j]);
                }
                Console.WriteLine();
            }
            Console.ReadKey();
           

        }
    }
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог