1228: ACM小组的数字游戏
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 27 Solved: 18
[ Submit][ Status][ Web Board]
Description
gestapolur近来喜欢上了一种填数字的游戏,如下图所示的4×4方格中,我们要选择从数字1到16来填满这十六个格子(Aij,其中i=1..4,j=1..4)。为了让游戏更有挑战性,我们要求下列六项中的每一项所指定的四个格子,其数字累加的和必须为34:
四个角落上的数字,即A11+A14+A41+A44=34。
每个角落上的2×2方格中的数字,例如左上角:A11+A12+A21+A22=34。
最中间的2×2方格中的数字,即A22+A23+A32+A33=34。
每条水平线上四个格子中的数字,即Ai1+Ai2+Ai3+Ai4=34,其中i=1..4。
每条垂直线上四个格子中的数字,即A1j+A2j+A3j+A4j=34,其中j=1..4。
两条对角线上四个格子中的数字,例如左上角到右下角:A11+A22+A33+A44=34。
右上角到左下角:A14+A23+A32+A41=34
A11 A12 A13 A14
A21 A22 A23 A24
A31 A32 A33 A34
A41 A42 A43 A44
Input
输入文件会指定把数字1先固定在某一格内。输入的文件只有一行包含两个正数据x和y,表示第x行和第y列的格子放数字1。剩下的十五个格子,请按照前述六项条件用数字2到16来填满。
Output
把全部的正确解答用每4行一组写到输出文件,每行四个数,相邻两数之间用一个空格隔开。两组答案之间,要以一个空白行相间,并且依序排好。排序的方式,是先从第一行的数字开始比较,每一行数字,由最左边的数字开始比,数字较小的解答必须先输出到文件中。
Sample Input
1 1
Sample Output
1 4 13 16
14 15 2 3
8 5 12 9
11 10 7 6
1 4 13 16
14 15 2 3
12 9 8 5
7 6 11 10
HINT
Source
超级暴力的一道题
#include<iostream>
using namespace std;
int a[17], i, j, pos;
bool isOk(int positon)
{
if ((a[positon] < 1) || (a[positon]>16))
return false;
for (int i = 0; i < positon; i++)
if (a[i] == a[positon])
return false;
if ((positon != pos) && a[positon] == 1)
return false;
if ((positon == pos) && a[positon] != 1)
return false;
return true;
}
int main()
{
cin >> i >> j;
pos = (i - 1) * 4 + j;
for (a[1] = 1; a[1] <= 16; a[1]++)
if (isOk(1))
for (a[2] = 1; a[2] <= 16; a[2]++)
if (isOk(2))
for (a[3] = 1; a[3] <= 16;a[3]++)
if (isOk(3))
{
a[4]= 34 - a[1] - a[2] - a[3];
if (isOk(4))
for (a[5] = 1; a[5] <= 16;a[5]++)
if (isOk(5))
{
a[6] = 34 - a[1] - a[2] - a[5];
if (isOk(6))
for (a[7] = 1; a[7] <= 16;a[7]++ )
if (isOk(7))
{
a[8] = 34 - a[5] - a[6] - a[7];
if ((a[3] + a[4] + a[7] + a[8] == 34) && isOk(8))
for (a[9] = 1; a[9] <= 16; a[9]++)
if (isOk(9))
for (a[10] = 1; a[10] <= 16;a[10]++)
if (isOk(10))
{
a[11] = 34 - a[6] - a[7] - a[10];
if (isOk(11))
{
a[12] = 34 - a[9] - a[10] - a[11];
if (isOk(12))
{
a[13] = 34 - a[1] - a[5] - a[9];
if (isOk(13) && (a[4] + a[7] + a[10] + a[13] == 34))
{
a[14] = 34 - a[2] - a[6] - a[10];
{
if (isOk(14) && a[9] + a[10] + a[13] + a[14] == 34)
{
a[15] = 34 - a[3] - a[7] - a[11];
if (isOk(15))
{
a[16] = 34 - a[13] - a[14] - a[15];
if (isOk(16) && (a[11] + a[12] + a[15] + a[16] == 34) && (a[1] + a[4] + a[13] + a[16] == 34) && (a[1] + a[6] + a[11] + a[16] == 34))
{
for (int i = 1; i <=16; i++)
{
if (i % 4 != 0)
cout << a[i] << " ";
else
cout <<a[i]<< endl;
}
cout << endl;
}
}
}
}
}
}
}
}
}
}
}
return 0;
}
/**************************************************************
Problem: 1228
User: 0905130123
Language: C++
Result: Accepted
Time:676 ms
Memory:1484 kb
****************************************************************/