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. Google Maps API V3 之绘图库 信息窗口

    Google官方教程: Google 地图 API V3 使用入门 Google 地图 API V3 针对移动设备进行开发 Google 地图 API V3 之事件 Google 地图 API V3 ...

  2. [NHibernate]立即加载

    目录 写在前面 文档与系列文章 立即加载 一个例子 总结 写在前面 上篇文章介绍了nhibernate延迟加载的相关内容,简单回顾一下延迟加载,就是需要的时候再去加载,需要的时候再向数据库发出sql指 ...

  3. PHP慢脚本日志和Mysql的慢查询日志

    1.PHP慢脚本日志 间歇性的502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的. 在 PHP-FPM 的子进程数目超过的配置中的数量时候,会出 ...

  4. Android开发-取消程序标题栏或自定义标题栏

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 在Android开发中,跟据需要我们有时候需要自定义应用程序的标题栏或者取消程序的标题栏,下面本菜鸟在此记录与分享一下自己使用的方法 ...

  5. linux下实现在程序运行时的函数替换(热补丁)

    声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...

  6. 试图加载格式不正确的程序。 (异常来自HRESULT:0x8007000B)

    异常来自HRESULT:0x8007000B   缘由:在64位操作系统下IIS发布32位的项目,报“项目依赖的dll无法读取,试图加载格式不正确的程序”错误. 原因:程序集之间的通讯要么全是64位环 ...

  7. pathinfo()、dirname()、basename()获得文件的路径,名称等信息说明

    在PHP中,若想通过函数获得一个文件的路径.名称,或者是扩展名等,是非常容易的一件事.可以使用dirname().basename().pathinfo()等多种途径获得相应的信息. 假设现在有一个图 ...

  8. Ubuntu 12/14 个性化配置

    计算机名:jianbao-pc    用户名:jianbao 修改 /opt目录的 用户名 及 用户组 : sudo chown -R jianbao:jianbao /opt Ubuntu 如何开启 ...

  9. C和指针 第十章 结构和联合 (二)

    结构体传值: 结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率.如果不希望程序对结构体变量改变可以加入const关键词. typed ...

  10. js string 转 int Number()

    var numString = '122'; var numberInt = Number(numString); var res = numberInt/2; 结果: res = 61