View Full Version : الگوریتم مربع جادویی
ghasedak404
شنبه 14 آبان 1384, 01:22 صبح
به سلام خدمت همه دوستان عزیز
کی می تونه الگوریتم مربع جادویی رو بنویسه ؟
مربع جادویی یه ماتریس n * n هست که اعضای اون اعداد 1 , 2 , 3 , ... , n هستند که هر کدوم یک بار تکرار می شن و مجموع سطرها ، ستون ها و قطرهاش برابر هست . مثل مربع جادویی 5*5 :
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
ab_ba
شنبه 14 آبان 1384, 07:23 صبح
آیا این از لحاظ ریاضی ثابت شده است
یعنی به ازای هر عدد n یک چنین ماتریسی وجود دارد
seyedof
شنبه 14 آبان 1384, 09:41 صبح
سلام
فکر کنم به ازای n>=3 وجود داره. به عنوان یک راهنمایی الگوریتم برای n های زوج و فرد متفاوته و الگوریتم فردش نسبتا آسونه ولی برای زوج پیچیده تر است.
ممنون علی
ghasedak404
یک شنبه 15 آبان 1384, 00:35 صبح
سلام
آره . برای n های فرد ساده تر هست . از نظر ریاضی هم ثابت شده هست . اصلا یکی از مباحث ریاضیه .
حالا کسی هست حلش کنه ؟
someCoder
یک شنبه 15 آبان 1384, 23:28 عصر
توی مربع خودت دقت کنی میفهمی: از 1 شروع کن و بصورت ضربدری به سمت بالا سمت راست حرکت کن. دقت کنی میفهمی
ghasedak404
دوشنبه 16 آبان 1384, 08:57 صبح
سلام somecoder
آره دقیقا همین طوره . من هم به این نتیجه رسیدم .
حالا کسی می تونه با پاسکال برنامشو بنویسه ؟
البته ببخشید که اینجا مطرحش کردم .
bahane274
چهارشنبه 05 اردیبهشت 1386, 14:08 عصر
سلام ! الگوریتم این برنامه این طوریه که :1-عدد 1 را در خانه وسط در سطر اول مینویسیم.2-عدد بعدی را در خانه ای که شماره سطر و ستون آن یک واحد کم تر از مختصات خانه فعلی است یادداشت میکنیم ، اگر خانه فعلی بر روی حاشیه جدول قرار داشته باشد امکان حرکت به خانه بعدی وجود ندارد زیرا از محدوده جدول خارج میشود . در این گونه موارد جدول را به صورت یک استوانه در نظر میگیریم (مثلا در مورد عدد 2 چون بالای 6 و بیرون جدول میرود آن را پایین مینویسیم)
اگر خانه بعدی پر بود از خانه فعلی به خانه ای که شماره سطر آن یک واحد بیشتر از شماره سطر خانه فعلی است حرکت میکنیم .
تعداد سطر و ستون این ماتریس باید فرد باشد . مثلا 3*3 آن این طوری میشود : 8 1 6
3 5 7
4 9 2
bahane274
یک شنبه 09 اردیبهشت 1386, 11:41 صبح
سلام ! توضیحی که دادم برای ghasedak404 بود . اشتباه از من بود که نقل قول نگذاشتم . در مورد شما هم متاسفانه نمی توانم کمکی کنم اما اگر تستی پیدا کردم حتما شما را در جریان می گذارم . موفق باشید .
setare2007
جمعه 14 اردیبهشت 1386, 08:46 صبح
سلام
دیدم همگی به این برنامه نیاز دارید منم اونو در اختیارتون میزارم
البته با پاسکاله
uses
crt;
var
a:array[1..10,1..10]of byte;
row,col,i,j,n,x,y:integer;
begin
clrscr;
write('Enter number(odd): ');
readln(n);
writeln;
row:=1;
col:=n div 2+1;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=0;
a[row,col]:=1;
for i:=2 to n*n do
begin
row:=row-1;
col:=col-1;
if(row=0) then
row:=n;
if(col=0) then
col:=n;
if(a[row,col]=0) then
a[row,col]:=i
else
begin
if (row>=n) and (col>=n) then
begin
row:=row-n;
col:=col-n;
end;
row:=row+2;
col:=col+1;
a[row,col]:=i;
end;
end;
for x:=1 to n do
begin
for y:=1 to n do
begin
if (a[x,y]>=1) and (a[x,y]<=9) then
write(' ');
write(' ',a[x,y]);
end;
writeln;
end;
readln;
end.
majid_hamdi
چهارشنبه 30 اردیبهشت 1388, 23:10 عصر
با سلام خدمت همه دوستان
اگه كسي مي تونه هم الگوريتم مربع جادويي(3*3) و هم مساله 8 وزير را به زبان پرولوگ حل كنه و به من كمك كنه ممنون ميشم .
3tareha3moni
دوشنبه 08 تیر 1388, 14:52 عصر
با سلام خدمت همه دوستان
اگه كسي مي تونه هم الگوريتم مربع جادويي(3*3) و هم مساله 8 وزير را به زبان پرولوگ حل كنه و به من كمك كنه ممنون ميشم .
من هم همين سوال را دارم؟:اشتباه::متفکر:
Arcsinos
چهارشنبه 11 فروردین 1389, 18:31 عصر
سلام لطفا pdf رو ببینید .
اگه 4*4 رو دارید بهم بگید .
jlover
پنج شنبه 12 فروردین 1389, 10:47 صبح
چه جالب
منم این الگوریتم رو زمانیکه قسمت آرایه ها رو تموم کردم به عنوان تمرین آخر فصل پیاده سازی کرده بودم ( با جاوا ).
امیدوارم به دردتون بخوره :
/**
*
* author Esmaeil Ashrafi <>
*/
public class MagicSquare {
private String state = new String();
public MagicSquare() {
}
public String getState () {
return state ;
}
/**
* determines there is repeated numbers in the table or not
* @param a - the two dimensional array indicates the table
* @return true if table doesnt have any repeated number
*/
public boolean hasRepeated ( int[][] a ) {
/* java.util.Vector v = new java.util.Vector();
for (int i=0 ; i < a.length ; i++ )
for (int j=0 ; j < a.length ; j++ ){
v.addElement( new Integer(a[i][j]) );
if( v.indexOf(a[i][j]) != v.lastIndexOf(a[i][j]) )
return true ;
}
return false ;
*/
// another algorithm,more complicated,but maybe maybe more sufficient
for (int i=0 ; i < a.length ; i++ )
for (int j=0 ; j < a.length ; j++ )
for (int m=0 ; m <= i ; m++ )
for (int n=0 ; n < a.length ; n++ )
if ( a[i][j] == a[m][n] && !(m==i && n==j) )
return true;
return false;
}
public boolean isMagic( int[][] arr ) {
for(int i=0; i<arr.length; i++)
if ( arr.length != arr[i].length ){
state = "Not a square table";
return false;
}
for (int i=0 ; i < arr.length ; i++ )
for (int j=0 ; j < arr.length ; j++ )
if ( arr[i][j] < 1 || arr[i][j] > arr.length*arr.length ){
state = "some numbers out of range";
return false;
}
if ( hasRepeated(arr) ) {
state="the table has repeated numbers";
return false;
}
/* total : total value should every row,column or diagonal has
* row : total value of a row
* col : total value of a column
* ldt : left top 2 right diameter buttom toal value
* ldt : right top 2 left diameter buttom toal value
* r : row number
* c : colomn number
*/
int total , row , col , ldt , rdt , r , c ;
total=row=col=ldt=rdt=0;
/*
* set the value of sum of first row values 2 total
* and then compares every row and colomn to this value
*/
for(int i=0 ; i < arr.length ; i++ )
total+=arr[i][0]; // value of the first row
for (int i=0 ; i < arr.length ; i++ ) {
for (int j=0 ; j < arr.length ; j++ ) {
row+=arr[i][j]; col+=arr[j][i];
}
// if row==total and col==total,then row+col is 2*total
if ( (row+col) != (2*total) ){
state = "row and column values mismatch in row and column " + (i+1) ;
return false ;
}
row=col=0;
}
for (int i=0 ; i < arr.length ; i++ ) {
ldt+=arr[i][i];
rdt+=arr[i][arr.length-i-1];
}// calculates both diameter
if ( rdt+ldt != 2*total ){
state = "diameters values mismatch";
return false ;
}
return true ;
}
public static void main(String[] args){
System.out.println("\n*******************result of exercise 'Magic Square' :");
int[][] s = { {6,7,2},{1,5,9},{3,8,4} };
for(int i=0;i<s.length;i++){
for(int j=0;j<s[i].length;j++)
System.out.print(s[i][j]+" ");
System.out.println();
}
MagicSquare ms = new MagicSquare();
if ( ms.isMagic(s) )
System.out.println("Congratulation ! It's magic");
else
System.out.println( ms.getState() );
}
}
در ضمن این برای n*n هست.( البته n*n نباشه هم حتمن یه پیغامی میده )
اگه کسی ایرادی پیدا کرد(یعنی یه جدول داد و نتیجه ی غلط برگردوند بهم بگه،اینو خیلی وقت پیش نوشتم،احتمالن ایرادی نداره چون حتمن خودم 10 رقم تستش کردم...اگه داشت حتمن یادم میموند بعدن برطرفش کنم.ولی خب کار دیگه :چشمک:
---------------------
بچه ها من الان داشتم با خودم فکر میکردم منظور شما احتمالن ساختن یک مربع جادویی بوده ...
این برنامه میاد یک ماتریس m*n رو در قالب یه آرایه میگیره و تشخیص میده که جادویی هست یا نه !
پس شرمنده م .
nima898
دوشنبه 16 فروردین 1389, 12:08 عصر
سلام ! الگوریتم این برنامه این طوریه که :1-عدد 1 را در خانه وسط در سطر اول مینویسیم.2-عدد بعدی را در خانه ای که شماره سطر و ستون آن یک واحد کم تر از مختصات خانه فعلی است یادداشت میکنیم ، اگر خانه فعلی بر روی حاشیه جدول قرار داشته باشد امکان حرکت به خانه بعدی وجود ندارد زیرا از محدوده جدول خارج میشود . در این گونه موارد جدول را به صورت یک استوانه در نظر میگیریم (مثلا در مورد عدد 2 چون بالای 6 و بیرون جدول میرود آن را پایین مینویسیم)
اگر خانه بعدی پر بود از خانه فعلی به خانه ای که شماره سطر آن یک واحد بیشتر از شماره سطر خانه فعلی است حرکت میکنیم .
تعداد سطر و ستون این ماتریس باید فرد باشد . مثلا 3*3 آن این طوری میشود :
8 1 6
3 5 7
4 9 2
حرکت از 6 به 7 در مربع 3*3 مطابق این الگوریتم نیست
مربع 5*5 هم مطابق این الگوریتم نیست حرکت از ( 5 به 6 و 10 به 11 و 15 به 16 و 20 به 21 )
qwerty11
دوشنبه 16 فروردین 1389, 22:40 عصر
حرکت از 6 به 7 در مربع 3*3 مطابق این الگوریتم نیست
مربع 5*5 هم مطابق این الگوریتم نیست حرکت از ( 5 به 6 و 10 به 11 و 15 به 16 و 20 به 21 )
نه درسته. خونه ی بالا و سمت چپ عدد 6 خالی نیست (عدد 4 تو اون خونه هستش) پس مجبوریم یه خونه بیایم پایین.
mohandes ehsan
چهارشنبه 21 دی 1390, 11:44 صبح
لطفا درمورد عملكرد الگوريتم ماژيك كمكم كنيد.
vBulletin® v4.0.8, Copyright ©2000-1391, Jelsoft Enterprises Ltd.