رفتن به مطلب

سورس کد مربع جادویی n*n در PHP


پست های پیشنهاد شده

دوستان عزیز کسی وقت آزاد داره یه کمک به ما بده ؟

نیاز به کد PHP مربع جادویی n*n دارم .

کدش رو برای جاوا دارم اما به زبان php نیازش دارم

ممنون

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

کسی هم برای جاوا خاست بگه براش بزارم.

لینک به ارسال

یه عدد N رو از ورودی دریافت کنه و بعد از اون یه ماتریس N*N تشکیل بده که مجموع سطر و ستون و قطرها با هم برابر باشند.

کدش در جاوا :


public class MagicSquare {
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
if (N % 2 == 0) throw new RuntimeException("N must be odd");
int[][] magic = new int[N][N];
int row = N-1;
int col = N/2;
magic[row][col] = 1;
for (int i = 2; i <= N*N; i++) {
if (magic[(row + 1) % N][(col + 1) % N] == 0) {
row = (row + 1) % N;
col = (col + 1) % N;
}
else {
row = (row - 1 + N) % N;
// don't change col
}
magic[row][col] = i;
}
// print results
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (magic[i][j] < 10) System.out.print(" "); // for alignment
if (magic[i][j] < 100) System.out.print(" "); // for alignment
System.out.print(magic[i][j] + " ");
}
System.out.println();
}
}
}

ویرایش شده توسط m.Mosibat
لینک به ارسال

یکم مختصر ترش در جاوا :


public static void main(String[] args) {
int order = 4;
for (int row = 0; row < order; row++) {
for (int col = 0; col < order; col++) {
int rowMatrix = (((order + 1) / 2 + row + col) % order);
int colMatrix = (((order + 1) / 2 + row + order - col - 1) % order) + 1;
System.out.print(((rowMatrix * order) + colMatrix) + "\t");
}
System.out.println();
}
}
}

کسی نمیتونه کمکمون کنه ؟

لینک به ارسال

والا من الگوریتم رو بلدم ولی اجراش نکردم تا حالا. اگه می خوای برات بنویسم.

لینک به ارسال

والا من الگوریتم رو بلدم ولی اجراش نکردم تا حالا. اگه می خوای برات بنویسم.

ممنون میشم.

لینک به ارسال

ببینید تو ماتریس جادویی اولین شرط اینه ماتریس مربع باشه. یعنی سطر و ستون برابر باشه. دومین شرط اینه که تعداد سطر و ستون ها فرد باشه. مثلا 3*3. من همین 3*3 رو براتون مثال میزنم.

3 تا سطر داریم 3 تا ستون.

ما باید اعداد 1 تا 9 رو طوری تو این جدول بچینیم که جمع سطر ها در همه حالات برابر شه. تو این مثال ما یعنی باید 15 بشه.

عدد 1 رو میزارم خونه وسط از سطر اول.(طبق شکل)

عدد 9 یعنی (3*3) رو میزارم خونه وسط سطر آخر.(طبق شکل)

09993d6f2ae96a4c1.png

حالا 2 کجا باید قرار بگیره؟ طبق قانون این بازی اگر 1تو این محل باشه، عدد بعدی تو خونه ی گوشه بالا سمت راستش هست یعنی مشکل شکل زیر:

836a525d10afb51c1.png

خب حالا که یک اونجا نیست پس 2 رو کجا بزاریم؟ قانون برعکس میشه! گوشه سمت راست پایین. به شکل زیر:

7617d3e77304a5611.png

حالا نوبت عدد 3 هست. 3 هم باید گوشه بالا سمت راست عدد قبلی باشه. ما نداریم تو جدولمون همچین خونه ای. پس میره گوشه سمت چپ. شکل زیر:

c1c81ed949b2d9151.png

یه قانون دیگه تو این بازی هست. این قانون میگه که اگه به عددی رسیدی که یکی از مضارب تعداد سطرها یا ستون ها بود عدد بعدی رو زیر اون عدد بزار. الان ما به 3 رسیدیم. 3 مضرب 3 است. پس 4 قرار میگیره زیر 3. شکل زیر:

8f218092715a80901.png

5 و 6 هم طبق قانونی که گفتیم گوشه بالا سمت راست عدد قیلی میرن بالا. شکل زیر:

7fa4ad4a2842c3451.png

آقا 6 مضرب 3 هست؟ بله. پس 7 میره زیرش. شکل زیر:

8f9a7b8864a381861.png

8 هم که قاعدتا تو جای خالی قرار میگیره. اگه دقت کنید قانون هم درست جای 8 رو همون جا مشخص کرده. 8 باید بره بالا گوشه راست7، نداریم همچین خونه ای، میره گوشه سمت چپ. شکل:

7e37dd9e7693343e1.png

9 رو هم که همون اول گذاشته بودیم. با قانونمون هم که درست در اومد :).

جمع سطرها، ستون ها و قطرهای همگی عدد 15 رو به ما میدن. برای 5*5 روی روی کاغذ رسم کنید. خیلی براتون آسون میشه.

لینک به ارسال

این کد برای فقط ماتریس مربعی فرد نوشتم


<?php
$num = 3;
$output = '';
$matrix = array();
if ( $num % 2 !== 0 ) {
for ($i=1; $i <= $num; $i++) {
$matrix[$i] = array();
for ($j=1; $j <= $num ; $j++) {
$index = ( $num * ( ( $i + $j - 1 + floor( $num / 2 ) ) % $num ) ) + ( ( $i + ( 2 * $j ) - 2 ) % $num ) + 1;
$matrix[$i][$j] = $index;
}
}
$output .= '<table class="table">';
$output .= '<caption>M = Order '.count($matrix).'</caption>';
$output .= '<tbody>';
foreach ($matrix as $row => $cols) {
$output .= '<tr>';
foreach ($cols as $col) {
$output .= '<td>'.$col.'</td>';
}
$output .= '</tr>';
}
$output .= '</tbody>';
$output .= '</table>';
}
echo $output;
?>

نمایش آنلاین


http://69.195.223.90/574c1-2/

لینک به ارسال

این کد برای فقط ماتریس مربعی فرد نوشتم


<?php
$num = 3;
$output = '';
$matrix = array();
if ( $num % 2 !== 0 ) {
for ($i=1; $i <= $num; $i++) {
$matrix[$i] = array();
for ($j=1; $j <= $num ; $j++) {
$index = ( $num * ( ( $i + $j - 1 + floor( $num / 2 ) ) % $num ) ) + ( ( $i + ( 2 * $j ) - 2 ) % $num ) + 1;
$matrix[$i][$j] = $index;
}
}
$output .= '<table class="table">';
$output .= '<caption>M = Order '.count($matrix).'</caption>';
$output .= '<tbody>';
foreach ($matrix as $row => $cols) {
$output .= '<tr>';
foreach ($cols as $col) {
$output .= '<td>'.$col.'</td>';
}
$output .= '</tr>';
}
$output .= '</tbody>';
$output .= '</table>';
}
echo $output;
?>

نمایش آنلاین


http://69.195.223.90/574c1-2/

آقا خیلی ازت ممنونم ازت.

امکانش هست این خط رو برام توضیح بدی ؟


$index = ( $num * ( ( $i + $j - 1 + floor( $num / 2 ) ) % $num ) ) + ( ( $i + ( 2 * $j ) - 2 ) % $num ) + 1;

و اینکه چه دلیلی داره که برای ورودی زوج نمیشه پیادش کرد ؟

لینک به ارسال

الگوریتم میگه که این ماتریس فقط برای ورودی فرد جواب دارد. دلیلش رو منم نمی دونم !

لینک به ارسال

الگوریتم میگه که این ماتریس فقط برای ورودی فرد جواب دارد. دلیلش رو منم نمی دونم !

عزیز جان دستت درد نکنه برای کد اما اون یه خط رو که دادم میتونی برام توضیح بدی که دقیقاً چیکار میکنه ؟

لینک به ارسال

تابع floor کارش اینه که عدد رو به پایین گرد می کنه. index رو هم که تو حلقه هر دفعه داره چاپ می کنه.

num همون تعداد سطر و ستون هست. که تو این مثال 3 در نظر گرفته شده. ماتریس 3*3. بعد طبق فرمولش اومده محاسبه کرده ریخته تو index بعد چاپش کرده. یه بار که trace کنید متوجه می شید.

ویرایش شده توسط S M Mahdavi
لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...