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();
Помогите с алгоритмом
"Осуществить циклический сдвиг элементов квадратной матрицы размером М х N вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него — в последнюю строку справа налево, и: нее — в первый столбец снизу вверх, из него — в первую строку; для остальных: элементов — аналогично."
Помогите составить алгоритм, код могу и сам написать по алгоритму, но никак не могу сообразить как это движение реализовать...
Пишу в VS 2010 C#
Как я понял движение в матрице происходит примерно так:
j:n по i от 0 до n-1 сдвигать вниз
i:n по j от i до 1 сдвигать влево
j:0 по i от n до 1 сдвигать вверх
Это для первого круга. Если подумать, то константы можно заменить переменными и применить алгоритм к любому кругу.
Вот что у меня вышло...
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--;}
}
Я думал что потеряю только угловые элементы, а получилось, что почти все заполняется первым элементом...
Use [[COLOR="white"]x[/COLOR]code], Luke.
Мне нужно что бы на определенное количество элементы сдвигались "змейкой" друг за другом по кругу...
Код работает в точности как изображено на рисунке. И сдвигается друг за другом. Либо ты что-то не досмотрел в том, как работает код, либо твоя картинка не отражает задания.
Код:
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]);
//------------------------------------
}
{
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]);
//------------------------------------
}
Принцип в том, что считываем внешний "круг" в очередь, "прокручиваем" очередь на нужное количество элементов, записываем обратно, "сужаем" круг и проделываем ещё раз и так пока не проходят все "круги". В итоге "прокручиваем" все "круги" на нужное нам количество элементов :) Вот такое хитрозапутанное задание...
[COLOR="white"]([/COLOR]-_-[COLOR="white"])[/COLOR]
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();
}
}
}
Код:
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();
}
}
}
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();
}
}
}