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. Elastic-Job-分布式调度解决方案

    Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成. Elastic-Job-Lite定位为轻量级无中心化解 ...

  2. Excel通用类工具(一)

    前言 最近项目中遇到要将MySQL数据库中的某些数据导出为Excel格式保存,在以前也写过这样的功能,这次就准备用以前的代码,但是看了一下,这次却不一样,因为在以前用到的都是导出一种或几种数据,种类不 ...

  3. JavaScript是如何工作: 深入探索WebSocket和HTTP/2与SSE + 如何选择正确的路径!

    原文:<JavaScript是如何工作: 深入探索 websocket 和HTTP/2与SSE +如何选择正确的路径! 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 文章底部分 ...

  4. JavaScript学习备忘

    1.您只能在 HTML 输出流中使用 document.write 如果在文档已加载后使用它(比如在函数中),会覆盖整个文档 2.数组 : [40, 100, 1, 5, 25, 10] <== ...

  5. javascript中call()、apply()的区别

    call().apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this.即,锚点滑动任何函数可以作为任何对象的方法来调用. 2.两个方法都 ...

  6. 通过css3实现的动画导航菜单代码

    用css3样式实现的滑动导航菜单,html代码如下 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" &quo ...

  7. Atom插件安装及推荐

    简介(了解更多去google或baidu) Atom 代码编辑器支持 Windows.Mac.Linux 三大桌面平台,完全免费,并且已经在 GitHub 上开放了全部的源代码.在经过一段长时间的迭代 ...

  8. js-new、object.create、bind的模拟实现【转载备忘】

    //创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _ ...

  9. 关于相机拍照获取图片onActivityResult返回data 为null的问题

    调用相机拍摄方法 /** * capture new image */ protected void selectPicFromCamera() { if (!EaseCommonUtils.isSd ...

  10. 【最新】Android使用jenkins全自动构建打包-Windows版本(Android,Jenkins,360加固,Email,QRcode,参数构建,蒲公英)

    Android打包喝咖啡系列(Windows版) 这篇博客主要讲述的内容: 1.windows上部署Jenkins https://jenkins.io 2.基于SVN或Git https://git ...