PDA

View Full Version : سوال: راهنمایی در مورد الگوریتم مربع اعداد



mohammad2407
شنبه 12 اردیبهشت 1394, 17:47 عصر
سلام دوستان عزیز میخواستم در مورد الگوریتم شکل زیر منو راهنمایی کنید

130825

Mofid.m
یک شنبه 13 اردیبهشت 1394, 01:23 صبح
درود بر شما



public static int[,] matrix;

static void Main(string[] args)
{

Console.Write("Enter a Odd Number: ");
int n = Convert.ToInt32(Console.ReadLine());


if (n % 2 == 1)
{
matrix = new int[n, n];
int start = 0, end = n-1;


Algoritm(start,end);
Display(matrix, n);

}
else
Console.WriteLine("ERROR: You must will be Odd number!");


Console.ReadKey();
}


static void Algoritm(int s,int e)
{
if (s == e)
matrix[s, e] = 1;
else
{
matrix[s, s] = 1;
matrix[s, e] = 1;
matrix[e, s] = 1;
matrix[e, e] = 1;


for (int i = s+1; i <= e-1; i++)
{
matrix[s, i] = 2;
matrix[i, s] = 5;
matrix[e, i] = 4;
matrix[i, e] = 3;
}

Algoritm(s + 1, e - 1);
}


}


static void Display(int[,] matrix,int m)
{
Console.WriteLine("-------------------------------");
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
Console.Write(matrix[i, j].ToString() + " ");
Console.WriteLine();
}
}


این چی بود بابا!!!!!!
مغزم ترکید....

اینم سورس


130814

mohammad2407
یک شنبه 13 اردیبهشت 1394, 06:33 صبح
ممنون لطفا کردین :تشویق:
:لبخند: هیچ کسی بلد نیست

دوست عزیز میشه خط به خط برام توضیح بدی که چکار کردی

اخه بیشتر برای من توضیح و راه حل مهم هست

بیشتر هم قسمت زیر ::


static void Algoritm(int s,int e) {
if (s == e)
matrix[s, e] = 1;
else
{
matrix[s, s] = 1;
matrix[s, e] = 1;
matrix[e, s] = 1;
matrix[e, e] = 1;


for (int i = s+1; i <= e-1; i++)
{
matrix[s, i] = 2;
matrix[i, s] = 5;
matrix[e, i] = 4;
matrix[i, e] = 3;
}

Algoritm(s + 1, e - 1);
}






واقعا ممنون میشم

Mofid.m
یک شنبه 13 اردیبهشت 1394, 13:39 عصر
درود به شما
1-اول ما یه عدد فرد از ورودی میگیریم.

Console.Write("Enter a Odd Number: ");
int n = Convert.ToInt32(Console.ReadLine());

2-بعد میایم یه آرایه دو بعدی n*n میسازیم.

matrix = new int[n, n];

3-چون طول و عرض ماتریس یکی هستش ما دوتا متغیر میگیریم start که برابر با شروع آرایه (0) و end که برابر با پایان آرایه (n-1)

int start = 0, end = n-1;

4- حالا اون تابع(Algoritm) رو فراخوانی میکنیم .
این تابه یه تابه بازگشتیه که میاد هر دفعه سطر اول و سطر آخر و ستون اول و ستون آخر رو پر میکنه و برای پر کردن داخل آرایه یه بار دیگه خودشو فراخونی میکنه اما با start یکی بیشتر و end یکی کمتر.
یعنی دفعه دوم میاد سطر دوم و سطر یکی مونده به آخر و ستون دوم و ستون یکی مونده به آخر رو پر میکنه.

بزار یه مثال بزنم.
فرض کن ورودی n=5
ماتریس ما میشه 5*5

به این شکل
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

حالا تابع رو صدا میزنیم با start=0,end=4
اول برسی میکنیم start==end
که مسلما نیست(برای دفعه اول)
پس else اجرا میشه

با این دستور گوشه ها رو مقدار 1 میدیم

matrix[s, s] = 1; matrix[s, e] = 1;
matrix[e, s] = 1;
matrix[e, e] = 1;

منظور از s همون start و منظور از e همون end
ماتریس ما به این شکل تغییر میکنه
1 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1

بعد با این حلقه بقیه دور ماتریس رو پر میکنیم

for (int i = s+1; i <= e-1; i++) {
matrix[s, i] = 2;
matrix[i, s] = 5;
matrix[e, i] = 4;
matrix[i, e] = 3;
}
برای این شروع حلقه رو s+1 و پایان رو e-1 گرفتیم چون گوشه ها رو پر کردیم با 1
بعد اجرای این حلقه ماترس ما میشه با این شکل.

1 2 2 2 1
3 0 0 0 5
3 0 0 0 5
3 0 0 0 5
1 4 4 4 1

حالا میایم به start یکی اضافه میکنیم و همینطور از end یکی کم میکنیم.
علت این کار ما اینه که میخواییم اون دیگه با سطر ها و ستون های خارجی کاری نداشته باشیم.(با start و end هم روی سطر های آرایه و هم روی ستونهای آرایه مانور میدیم)
پس حالا start شده 1 و end شده 3.
با فراخوانی دوباره این تابع انگاری ماتریس رو کوچیک کردیم.
یعنی به این شکل
0 0 0
0 0 0
0 0 0

در صورتی که کوچیک نکردیم ماتریس همونه فقط تابع ما به دور تا دور آرایه که پر شده کاری نداره
پس عملا آرایه ما یه این شکله
1 2 2 2 1
3 0 0 0 5
3 0 0 0 5
3 0 0 0 5
1 4 4 4 1

اما دسترسی فقط به محتویات داخلی که پرنگ هستشه

حالا دوباره تابع فراخوانی شده
شرط اول برقرار نیست

if (s == e)

پس else اجرا میشه.
طبق توضیحات که قبلا دادم ماترس فقط قسمت بیرونیش پر میشه.
1 2 1
3 0 5
1 4 1

همونطوری که میبینی یه صفر اون وسط مونده.

به start یکی اضافه میکنیم که میشه 2 و از end یکی کم میکنیم که میشه 2

پس آرایه ما حالا شده
0
یعنی عملا به این شکل شده
1 2 2 2 1
3 1 2 1 5
3 3 0 5 5
3 1 4 1 5
1 4 4 4 1

پس الگوریتمو دوباره صدا میزنیم

شرط اول برقراره

if (s == e)

پس این دستور اجرا میشه

matrix[s, e] = 1;

با اجرای این دستور 1 در خانه وسطی آرایه مقدار دهی میشه.

و کار تابع تمام میشه.

Mofid.m
یک شنبه 13 اردیبهشت 1394, 13:53 عصر
دوست عزیز خواهشا پست اولتو برگردون به حالت قبل
یعنی سوالو همونطوری که بود با شکل مطرح کن.
بقیه دوستان هم حق دارن ببینن

mohammad2407
یک شنبه 13 اردیبهشت 1394, 14:09 عصر
تشکر از شما واقعا ممنون

یک سوال چرا گوشه های ماتریس رو یک قرار میدین ؟

آدرس عکس مشکل داشت داخل خوده سایت برنامه نویس پیوست کردم

Mofid.m
یک شنبه 13 اردیبهشت 1394, 14:12 عصر
چون طبق سوال شما باید قطر اصلی و قطر فرعی 1 باشه