Problem 洛谷P1274-魔术数字游戏

Accept: 118    Submit: 243
Time Limit: 1000 mSec    Memory Limit : 128MB

Problem Description

填数字方格的游戏有很多种变化,如下图所示的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

 Input

输入文件会指定把数字1先固定在某一格内。输入的文件只有一行包含两个正数据I和J,表示第1行和第J列的格子放数字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
 
题目链接:https://www.luogu.org/problemnew/show/P1274
 
题解:无脑爆搜就好,剪枝的话就按照题目说的剪,代码比较冗长
 
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std; const int maxn = ; int gra[maxn][maxn];
bool used[maxn*]; void output(){
for(int i = ;i <= ;i++){
printf("%d",gra[i][]);
for(int j = ;j <= ;j++){
printf(" %d",gra[i][j]);
}
printf("\n");
}
printf("\n");
} void dfs(int x,int y){
if(x > ){
output();
return;
}
if(gra[x][y] == ){
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ) return;
}
if(x == ){
if(gra[][y]+gra[][y]+gra[][y]+gra[][y] != ) return;
}
if(y == ){
if(gra[x][]+gra[x][]+gra[x][]+gra[x][] != ) return;
}
if(y == ) dfs(x+,);
else dfs(x,y+);
}
else{
for(int i = ;i <= ;i++){
if(!used[i]){
//output();
gra[x][y] = i;
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
continue;
gra[x][y] = ;
}
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
}
if(x== && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
}
if(x == && y==){
if(gra[][]+gra[][]+gra[][]+gra[][] != ){
gra[x][y] = ;
continue;
}
}
if(x == ){
if(gra[][y]+gra[][y]+gra[][y]+gra[][y] != ){
gra[x][y] = ;
continue;
}
}
if(y == ){
if(gra[x][]+gra[x][]+gra[x][]+gra[x][] != ){
gra[x][y] = ;
continue;
}
}
used[i] = true;
if(y == ) dfs(x+,);
else dfs(x,y+);
used[i] = false;
gra[x][y] = ;
}
}
}
} int main()
{
//freopen("input.txt","r",stdin);
int x,y;
scanf("%d%d",&x,&y);
memset(gra,,sizeof(gra));
memset(used,false,sizeof(used));
gra[x][y] = ;
used[] = true;
dfs(,);
return ;
}

洛谷P1274-魔术数字游戏的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. P1274 魔术数字游戏 naive搜索+剪枝

    真的naive...... 我把所有能剪的枝都剪了才过的.否则就是TTT 还有个很神奇的事:数组作为参数传进递归函数时会造成上一层函数里的数组的改变.这个我TM调了一天. 下面奉上代码 #includ ...

  3. 洛谷P1288 取数游戏II(博弈)

    洛谷P1288 取数游戏II 先手必胜的条件需要满足如下中至少 \(1\) 条: 从初始位置向左走到第一个 \(0\) 的位置,经过边的数目为偶数(包含 \(0\) 这条边). 从初始位置向右走到第一 ...

  4. 洛谷 P2602 [ZJOI2010]数字计数

    洛谷 第一次找规律A了一道紫题,写篇博客纪念一下. 这题很明显是数位dp,但是身为蒟蒻我不会呀,于是就像分块打表水过去. 数据范围是\(10^{12}\),我就\(10^6\)一百万一百万的打表. 于 ...

  5. BZOJ1059或洛谷1129 [ZJOI2007]矩阵游戏

    BZOJ原题链接 洛谷原题链接 通过手算几组例子后,很容易发现,同一列的\(1\)永远在这一列,且这些\(1\)有且仅有一个能产生贡献,行同理. 所以我们可以只考虑交换列,使得每一行都能匹配一个\(1 ...

  6. BZOJ1833或洛谷2602 [ZJOI2010]数字计数

    BZOJ原题链接 洛谷原题链接 又是套记搜模板的时候.. 对\(0\sim 9\)单独统计. 定义\(f[pos][sum]\),即枚举到第\(pos\)位,前面枚举的所有位上是当前要统计的数的个数之 ...

  7. bzoj 4816: 洛谷 P3704: [SDOI2017]数字表格

    洛谷很早以前就写过了,今天交到bzoj发现TLE了. 检查了一下发现自己复杂度是错的. 题目传送门:洛谷P3704. 题意简述: 求 \(\prod_{i=1}^{N}\prod_{j=1}^{M}F ...

  8. 【题解】洛谷P1080 [NOIP2012TG] 国王游戏(贪心+高精度)

    次元传送门::洛谷P1080 思路 我们模拟一下只有两个大臣的时候发现 当a1​∗b1​<a2​∗b2​是ans1<ans2 所以我们对所有大臣关于左右手之积进行排序 得到最多钱的大臣就是 ...

  9. 洛谷P4606 [SDOI2018]战略游戏 【圆方树 + 虚树】

    题目链接 洛谷P4606 双倍经验:弱化版 题解 两点之间必经的点就是圆方树上两点之间的圆点 所以只需建出圆方树 每次询问建出虚树,统计一下虚树边上有多少圆点即可 还要讨论一下经不经过根\(1\)的情 ...

随机推荐

  1. 【Spring】使用Spring发送邮件

    Spring Email抽象的核心是MailSender接口,MailSender的实现能够通过连接Email服务器实现邮件发送的功能,如下图: Spring自带一个MailSender的实现就是Ja ...

  2. python基础学习(八)元组

    元组的定义 Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改 元组 表示多个元素组成的序列 元组 在 Python 开发中,有特定的应用场景 用于存储 一串 信息,数据 之间使用 , 分 ...

  3. VirtualBox VM启用3D加速

    默认情况下,是不支持 DX3D的, 我们运行 dxdiag 看到的情况如下: 安装时也提示需要安全模式下才能安装 VirtualBox 必须在Windows安全模式下才能成功安装3D加速驱动。 重启系 ...

  4. javascript浅拷贝深拷贝详解

    一.浅拷贝 浅拷贝在现实中最常见的表现在赋值上面,例如 <!DOCTYPE html> <html lang="en"> <head> < ...

  5. idea代码提示

    idea代码提示:Keymap-->Main menu-->Code-->Completion去掉Cyclic Expand Word的快捷键将Basic的快捷键更改为Alt+/

  6. linux 下修改mysql下root 权限来允许远程连接

    MySQL默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接. 其操作简单,如下所示: 1. 进入mysql: /usr/local/mysql/bin/ ...

  7. Linux禁止ping以及开启ping的方法

    ---恢复内容开始--- Linux默认是允许Ping响应的,系统是否允许Ping由2个因素决定的:A.内核参数,B.防火墙,需要2个因素同时允许才能允许Ping,2个因素有任意一个禁Ping就无法P ...

  8. springboot 整合 redis

    jedis 和 lettuce 都是用来连接 redis 的客户端,jedis 如果不使用连接池是非线程安全的,lettuce 使用 netty 线程安全且并发性能更好: springboot 2.x ...

  9. 在Arcmap中加载互联网地图资源的4种方法

    前一段时间想在Arcmap中打开互联网地图中的地图数据,如影像数据.基础地图数据等,经过简单研究目前总结了四种方法,整理下与大家分享,有些内容可能理解有误,希望大家多多指教.4种方法如下: a)    ...

  10. Tab 菜单切换

    <link rel="stylesheet" href="https://blog-static.cnblogs.com/files/hshen/layui.css ...