Input

文件中包含初始的盘件描述,一共有10行,第i行有i个字符。如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对应的字母。如果第i行的第j个字符是”.”,则表示第i行第j列的格子上没有放零件。输入保证预放的零件已摆放在盘件中。

Output

如果能找到解,向输出文件打印10行,为放完全部12个零件后的布局。其中,第i行应包含i个字符,第i行的第j个字符表示第i行第j列的格子上放的是哪个零件。如果无解,输出单独的一个字符串‘No solution’(不要引号,请注意大小写)。所有的数据保证最多只有一组解。

Sample Input

.
..
...
....
.....
.....C
...CCC.
EEEHH...
E.HHH....
E.........

Sample Output

B
BK
BKK
BJKK
JJJDD
GJGDDC
GGGCCCI
EEEHHIIA
ELHHHIAAF
ELLLLIFFFF
 
备注:题面建议大家去BZOJ官网去看,因为格式问题这里的图片只能这么小。BZOJ 1051:http://www.lydsy.com/JudgeOnline/problem.php?id=1501
 
 
 
题解:
  实在没什么好讲的。。。虽然说这次校内的考试中我把80分的写出来了(有10分是忘了No solution。。无语),但是无法保证在考场上能够有如此良好的心态写个2小时!我们取每个图案的每个方向,记以左上角的那个点为原点,记录其他点的相对关系。然后在地图上一个个位置进行判断是否可行。思路并不复杂,但是记录其他点得相对关系这个部分,写得丑的可以写出几10k+,写得好的也要6k。
  但是如果就是这么做的话,只有90分。因为有一个数据点故意卡!我觉得这个数据真的不明觉厉,有种卡得莫名其妙,因为他唯一已经放置的智慧珠在右下方,有且仅有一个,所有前面部分搜的时间特别长,所以要把地图调换一下方向。这谁会这么去想啊!而且即便就是这么做了,其实一样地,如果我把唯一的一个智慧珠放在左下角,是没有任何办法通过的,所以这道题还是存在很多疑问的。
  还有一种做法是Dacing-Link,我没有去了解,可以上网查查,你会发现就查到这一道题了,所以并没有什么意义。
 
代码(90分):
------------------------------------------------------------------------------------------------------

#include <cstdio>
#include <cstdlib>
#define MAXN 15
#define DFS_next if (y == x) DFS(x + 1, 1); else DFS(x, y + 1)

const int a[100][6] = {
{0, 0, 0, 0, 0, 0},

{0, 1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 0}, {0, 1, 1, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 3, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 1, 0, 0}, {0, 0, 1, 2, 0, 0}, {0, 1, 1, 1, 0, 0}, {0, 1, 2, 2, 0, 0},
{0, 1, 1, 1, 0, 0}, {0, 0, 1, 2, 0, 0}, {0, 0, 0, 1, 0, 0}, {0, 1, 2, 2, 0, 0},

{0, 0, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 2, 2, 0}, {0, 0, 0, 1, 2, 0}, {0, 1, 2, 2, 2, 0}, {0, 0, 0, 1, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 0}, {0, 1, 1, 2, 3, 0}, {0, 1, 1, 1, 1, 0}, {0, 1, 2, 3, 2, 0},
{0, 1, 1, 1, 1, 0}, {0, 1, 1, 2, 3, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 2, 2, 3, 0},

{0, 0, 0, 1, 1, 0}, {0, 1, 2, 0, 2, 0}, {0, 1, 1, 1, 0, 0}, {0, 0, 1, 2, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 1, 1, 0}, {0, 0, 1, 1, 1, 0}, {0, 1, 0, 1, 2, 0}, {0, 1, 2, 2, 1, 0},
{0, 0, 1, 1, 1, 0}, {0, 0, 1, 1, 2, 0}, {0, 1, 1, 2, 2, 0}, {0, 0, 0, 1, 1, 0},

{0, 0, 0, 1, 1, 0}, {0, 1, 2, 2, 3, 0}, {0, 0, 1, 1, 1, 0}, {0, 1, 1, 2, 3, 0},
{0, 0, 1, 1, 1, 0}, {0, 1, 2, 2, 3, 0}, {0, 0, 0, 1, 1, 0}, {0, 1, 1, 2, 3, 0},

{0, 1, 1, 1, 2, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 1, 2, 2, 0}, {0, 0, 1, 1, 2, 0}, {0, 0, 1, 1, 2, 0}, {0, 1, 1, 2, 2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 1, 0}, {0, 0, 1, 2, 3, 0}, {0, 1, 1, 1, 1, 0}, {0, 1, 2, 3, 3, 0},
{0, 1, 1, 1, 1, 0}, {0, 0, 1, 2, 3, 0}, {0, 0, 0, 0, 1, 0}, {0, 1, 2, 3, 3, 0}
};

const int b[100][6] = {
{0, 0, 0, 0, 0, 0},

{0, 0, 1, 0, 0, 0}, {0, 1, 1, 0, 0, 0}, {0,-1, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 0, 0, 0}, {0, 1, 2, 3, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 0, 0, 0}, {0, 1, 1, 1, 0, 0}, {0, 0,-1,-2, 0, 0}, {0, 0, 0, 1, 0, 0},
{0, 0, 1, 2, 0, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 2, 2, 0, 0}, {0, 0, 0,-1, 0, 0},

{0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 0, 1, 2, 0}, {0, 1, 2, 2, 2, 0}, {0, 0, 0,-1,-2, 0}, {0, 1, 2, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 3, 1, 0}, {0, 0,-1, 0, 0, 0}, {0,-2,-1, 0, 1, 0}, {0, 0, 0, 0, 1, 0},
{0,-1, 0, 1, 2, 0}, {0, 0, 1, 0, 0, 0}, {0, 1, 2, 3, 2, 0}, {0, 0,-1, 0, 0, 0},

{0, 1, 2, 0, 2, 0}, {0, 0, 0, 1, 1, 0}, {0, 0, 1, 2, 2, 0}, {0, 1, 1, 1, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 0, 1, 0}, {0, 1,-1, 0, 1, 0}, {0, 0, 1, 1, 1, 0}, {0, 0, 0, 1, 1, 0},
{0, 1, 0, 1, 2, 0}, {0, 1, 0, 1, 0, 0}, {0,-1, 0,-1, 0, 0}, {0, 1, 2, 1, 2, 0},

{0, 1, 2, 2, 3, 0}, {0, 0, 0,-1,-1, 0}, {0, 1, 1, 2, 3, 0}, {0, 0,-1,-1,-1, 0},
{0, 1, 0,-1,-2, 0}, {0, 0, 0, 1, 1, 0}, {0, 1, 2,-1, 0, 0}, {0, 0, 1, 1, 1, 0},

{0,-1, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 0, 1, 1, 2, 0}, {0, 1, 0,-1,-1, 0}, {0, 1, 1, 2, 2, 0}, {0, 0,-1,-1,-2, 0},
{0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0},

{0, 1, 2, 3, 0, 0}, {0, 1, 1, 1, 1, 0}, {0, 0,-1,-2,-3, 0}, {0, 0, 0, 0, 1, 0},
{0, 0, 1, 2, 3, 0}, {0, 1, 0, 0, 0, 0}, {0, 1, 2, 3, 3, 0}, {0, 0, 0, 0,-1, 0}
};

const int tot[100] = {0, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};

const int inv[100] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0};

int vis[MAXN][MAXN], map[MAXN][MAXN], use[MAXN];

bool out(int o) { return o < 1 || o > 10; }

bool check(int o, int x, int y)
{
  if (inv[o]) return 0;
  for (int i = 1; i < tot[o]; i++)
  {
    int dx = x + a[o][i], dy = y + b[o][i];
    if (out(dx) || out(dy)) return 0;
    if (vis[dx][dy]) return 0;
  }
  return 1;
}

void DFS(int x, int y)
{
  if (x == 11 && y == 1)
  {
    for (int i = 1; i <= 10; i++)
    {
      for (int j = 1; j <= i; j++) printf("%c",map[i][j] + 'A' - 1);
      printf("\n");
    }
    exit(0);
  }
  if (vis[x][y]) { DFS_next; }
  else for (int i = 1; i <= 12; i++)
  {
    if (use[i]) continue;
    for (int j = 0; j <= 7; j++)
    {
      int o = i * 8 - j;
      if (check(o, x, y))
      {
        for (int k = 0; k < tot[o]; k++)
          vis[x + a[o][k]][y + b[o][k]] = 1, map[x + a[o][k]][y + b[o][k]] = i;
        use[i] = 1; DFS_next; use[i] = 0;
        for (int k = 0; k < tot[o]; k++) vis[x + a[o][k]][y + b[o][k]] = 0;
      }
    }
  }
}

char ch[MAXN];

int main()
{
  freopen("game.in", "r", stdin);
  freopen("game.out", "w", stdout);
  for (int i = 1; i <= 10; i++)
  {
    scanf("%s",ch);
    for (int j = 0; j <= i - 1; j++)
    {
      if (ch[j] == '.') map[i][j + 1] = 0;
      else map[i][j + 1] = ch[j] - 'A' + 1, vis[i][j + 1] = 1, use[ch[j] - 'A' + 1] = 1;
    }
  }
  for (int i = 1; i <= 10; i++)
    for (int j = 10; j > i; j--) vis[i][j] = 1;
  DFS(1,1);
  printf("No solution");
  return 0;
}

------------------------------------------------------------------------------------------------------

[BZOJ1501][NOI2005] 智慧珠游戏的更多相关文章

  1. 【搜索好题】bzoj1501 [NOI2005]智慧珠游戏

    bzoj1501 [NOI2005]智慧珠游戏 搜索苟逼题系列. 暴力枚举每一种情况(包括旋转翻转全都考虑在内)然后码出代码. (正解似乎不是这样子的) 那年好像还有平衡树苟逼题维护数列233333心 ...

  2. bzoj 1501: [NOI2005]智慧珠游戏 Dancing Link

    1501: [NOI2005]智慧珠游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 190  Solved: 122[Submit][Status] ...

  3. 洛谷 P4205 [NOI2005]智慧珠游戏 DFS

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P4205 [NOI2005]智慧珠游戏 题目描述 智慧 ...

  4. Luogu P4205 [NOI2005]智慧珠游戏

    国内少有的可以练习神仙算法--DLX的好题怎么可以被爆搜埋没呢? 看到这题没有DLX的题解所以写一篇,不过貌似我实现的太弱(构图太慢)所以速度上不是很快. 下面开始讲题,但请保证你要先学会DLX.(d ...

  5. 【BZOJ1501】【NOI2005】智慧珠游戏(搜索)

    [BZOJ1501][NOI2005]智慧珠游戏(搜索) 题面 我要一改我懒惰的作风 这道题目必须放题面 Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符. ...

  6. BZOJ 1501 智慧珠游戏

    Description Input 文件中包含初始的盘件描述,一共有10行,第i行有i个字符.如果第i行的第j个字符是字母”A”至”L”中的一个,则表示第i行第j列的格子上已经放了零件,零件的编号为对 ...

  7. ios版弹珠游戏源码

    这个是我们比较喜欢玩的一直小游戏的,ios版弹珠游戏源码,该游戏源码来着IOS教程网其他网友提供上传的,大家可以了解一下吧. nore_js_op>     <ignore_js_op&g ...

  8. zzulioj--1790-- 弹珠游戏(数学水题!)

    弹珠游戏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 14  Solved: 10 SubmitStatusWeb Board Descriptio ...

  9. 洛谷OJ P2356 弹珠游戏 维护前缀和

    题目描述 Description MedalPluS 和他的小伙伴 NOIRP 发掘了一个骨灰级别的游戏--超级弹珠. 游戏的内容是:在一个 n*n 的矩阵里,有若干个敌人,你的弹珠可以摧毁敌人,但只 ...

随机推荐

  1. Python学习笔记——条件和循环

    1.条件表达式 >>> x = 3 >>> x = 1 if x<3 else 2 >>> x 2 2.for语句用于序列类型 <1& ...

  2. margin双边距的问题

    margin:20px;height:20px;float:left margin:20px;height:20px;float:left

  3. 15个JavaScript本地存储技术的函数库和工具

    当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...

  4. CentOS6.3 编译安装LAMP(2):编译安装 Apache2.4.6

    Apache官方说: 与Apache 2.2.x相比,Apache 2.4.x提供了很多性能方面的提升,包括支持更大流量.更好地支持云计算.利用更少的内存处理更多的并发等.除此之外,还包括性能提升.内 ...

  5. Java总结篇系列:Java多线程(一)

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  6. mysql查询语句select-子查询

    1 子查询定义 在一个表表达中可以调用另一个表表达式,这个被调用的表表达式叫做子查询(subquery),我么也称作子选择(subselect)或内嵌选择(inner select).子查询的结果传递 ...

  7. Android 设置启动界面

    启动界面的意义是为了让后台处理耗时的复杂工作,当工作处理完成后,即可进入主界面.相比让用户等待布局加载完成,使用一张图片作为启动背景,会带来更好的体验. 首先,需要建立一个简单的布局: <?xm ...

  8. Unity3D LuaBundleLoader(基于cslua)

    说明:异步加载lua的bundle,会优先加载cache目录下bundle(一般更新的资源都在cache下) using System; using UnityEngine; using System ...

  9. Monkeyrunner 常用按键

    MonkeyRunner常用的按键介绍 Home键:KEYCOD_HOME   Back键:KEYCODE_BACK  send键:KEYCODE_CALL  end键:KEYCODE_ENDCALL ...

  10. MVC4.0

    --后台ajax传值 <script type="text/javascript">     $(document).ready(function dianZan(id ...