using System;
using System.Collections.Generic;
using System.Text;
namespace 计算题
{
class Program
{
static int[] num = new int[9] {4,8,3,6,5,2,7,1,9};
static int tab=0;
static void Main(string[] args)
{
///每行相加等15
tabR(0);
if (!tabR(1))
{
for (int i = 0; i < 8; i++)
{
for (int j = i + 1; j < 8; j++)
if (15 == (num[0] + num[i + 1] + num[j + 1]))
{
tab = num[1];
num[1] = num[i + 1];
num[i + 1] = tab;
tab = num[2];
num[2] = num[j + 1];
num[j + 1] = tab;
}
}
tabR(1);
}
///每列相加等15
tabC(0);
if (!tabC(1))
{
for (int i = 3; i < 6; i++)
{
for (int j = 7; j < 9; j++)
{
if (15 == (num[0] + num[i] + num[j]))
{
tab = num[3];
num[3] = num[i];
num[i] = tab;
tab = num[6];
num[6] = num[j];
num[j] = tab;
}
}
}
tabC(1);
}
///有一交叉等15
do
{
for (int i = 0; i < 8; i += 3)
{
tab = num[i];
num[i] = num[i + 2];
num[i + 2] = num[i + 1];
num[i + 1] = tab;
}
} while (15 != num[0] + num[4] + num[8]);
///如果一捺不等于15
if (15 != num[2] + num[4] + num[6])
{
Xa(0);
}
///如果一捺还不等于15
if (15 != num[2] + num[4] + num[6])
{
Xa(1);
}
///输出排好的数
for (int i = 0; i < 9; i++)
{
Console.Write(num[i]+" ");
if ((i + 1) % 3 == 0)
Console.Write("/n");
}
}
/// <summary>
/// 行排序
/// </summary>
/// <param name="o">第几行</param>
/// <returns>如果没有排就要从新排</returns>
public static bool tabR(int No)
{
int[] y ={ 0, 3 };
for (int i = y[No]; i < 8; i++)
{
for (int j = i + 1; j < 8; j++)
{
if (15 == (num[y[No]] + num[i + 1] + num[j + 1]))
{
tab = num[y[No] + 1];
num[1+y[No]] = num[i + 1];
num[i + 1] = tab;
tab = num[y[No]+2];
num[y[No]+2] = num[j + 1];
num[j + 1] = tab;
j = 7;
i = 8;
return true;
}
}
}
return false;
}
/// <summary>
/// 列排序
/// </summary>
/// <param name="o">第几列</param>
/// <returns>如果没有排就要从新排</returns>
public static bool tabC(int No)
{
int[] y ={ 3, 4 };
for (int i = y[No]; i < 6; i++)
{
for (int j = y[No] + 3; j < 9; j++)
{
if (15 == (num[No] + num[i] + num[j]))
{
tab = num[y[No]];
num[y[No]] = num[i];
num[i] = tab;
tab = num[y[No] + 3];
num[y[No] + 3] = num[j];
num[j] = tab;
i = 6;
j = 9;
return true;
}
}
}
return false;
}
/// <summary>
/// 撇上的两组数交换
/// </summary>
/// <param name="No">第一组还是第二组</param>
public static void Xa(int No)
{
int[,] ybk ={{0,0},{1,3}};
for (int i = 0; i < 8; i += 3)
{
tab = num[i+ybk[No,0]];
num[i+ybk[No,0]] = num[i+ybk[No,0] + 1];
num[i+ ybk[No,0] + 1] = tab;
}
for (int i = 0; i < 3; i++)
{
tab = num[i + ybk[No,1]];
num[i + ybk[No,1]] = num[i + ybk[No,1] + 3];
num[i + ybk[No,1] + 3] = tab;
}
}
}
}