CSU 1228 ACM小组的数字游戏

1228: ACM小组的数字游戏

Time Limit: 10 Sec   Memory Limit: 128 MB
Submit: 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
****************************************************************/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值