目录

题面

思路

思路

AC代码


题面

Square Ice

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 4526   Accepted: 1759

Description

Square Ice is a two-dimensional arrangement of water molecules H2O, with oxygen at the vertices of a square lattice and one hydrogen atom between each pair of adjacent oxygen atoms. The hydrogen atoms must stick out on the left and right sides but are not allowed to stick out the top or bottom. One 5 x 5 example is shown below.

Note that each hydrogen atom is attached to exactly one of its neighboring oxygen atoms and each oxygen atom is attached to two of its neighboring hydrogen atoms. (Recall that one water molecule is a unit of one O linked to two H's.) 

It turns out we can encode a square ice pattern with what is known as an alternating sign matrix (ASM): horizontal molecules are encoded as 1, vertical molecules are encoded as -1 and all other molecules are encoded as 0. So, the above pattern would be encoded as:

An ASM is a square matrix with entries 0, 1 and -1, where the sum of each row and column is 1 and the non-zero entries in each row and in each column must alternate in sign. (It turns out there is a one-to-one correspondence between ASM's and square ice patterns!) 

Your job is to display the square ice pattern, in the same format as the example above, for a given ASM. Use dashes (-) for horizontal attachments and vertical bars (|) for vertical attachments. The pattern should be surrounded with a border of asterisks (*), be left justified and there should be exactly one character between neighboring hydrogen atoms (H) and oxygen atoms (O): either a space, a dash or a vertical bar.

Input

Input consists of multiple cases. Each case consists of a positive integer m (<= 11) on a line followed by m lines giving the entries of an ASM. Each line gives a row of the ASM with entries separated by a single space. The end of input is indicated by a line containing m = 0.

Output

For each case, print the case number (starting from 1), in the format shown in the Sample Output, followed by a blank line, followed by the corresponding square ice pattern in the format described above. Separate the output of different cases by a blank line.

Sample Input

2
0 1
1 0
4
0 1 0 0
1 -1 0 1
0 0 1 0
0 1 0 0
0

Sample Output

Case 1:

***********
*H-O H-O-H*
* | *
* H H *
* | *
*H-O-H O-H*
*********** Case 2: *******************
*H-O H-O-H O-H O-H*
* | | | *
* H H H H *
* | *
*H-O-H O H-O H-O-H*
* | | *
* H H H H *
* | | *
*H-O H-O H-O-H O-H*
* | *
* H H H H *
* | | | *
*H-O H-O-H O-H O-H*
*******************

Source

East Central North America 2001

思路

没怎么看懂题意。但是知道了这么几个点:

1. 竖直的水分子不会出现在第一行和最后一行。

2. 给出的矩阵1,-1是交替出现的。

从样例输出观察出了输出行数,输出列数,H原子,O原子的规律。

不包括边界星号的话,行数是4*m-3,列数是4*m+1.

思路

先把星号,氧原子,氢原子放好,其余空格填充。

另外开一个数组该位置的原子已经连了几个键。

首先根据输入把水平水分子和竖直水分子的键连了,并且更新“连键”数组。

H原子分成两种类型。

一种是其键只能水平连的(横纵坐标都是模4余1),一种是其键只能竖直连的(横纵坐标都是模4余3)。

先只考虑水平型,我们连向与它相邻的O原子(必须空余键值为0,否则可能可能两个水平型H原子连到一个O原子变成一个水平水分子)。

按理来说,处理完完水平型的H原子,应该没有O原子剩余键数是2(否则它就只能通过两个竖直型H原子来连,那样就构成了竖直型水分子)。

然后考虑竖直型H原子,显然只能连到相邻的已经连了一个H原子的O原子上。

因为没怎么看懂题意,所以是连蒙带猜的,为了好检验我是否猜错了。我的代码中见了抛出异常。

如果我猜错了,那么就会抛出异常,评测状态是RE.

结果WA了好几次——因为Case,空行的格式

AC代码

#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int kMaxSquareSize = 11;
char board[4*kMaxSquareSize-1][4*(kMaxSquareSize+1)];
int link_cnt[4*(kMaxSquareSize)+3][4*(kMaxSquareSize+1)]; int in[kMaxSquareSize][kMaxSquareSize]; inline bool is_border(int h,int w,int i,int j) {
return i == 0 || i+1 == h || j == 0 || j+1 == w;
} inline bool is_oxygen(int i,int j) {
return i%4 == 1 && j%4 == 3;
} inline bool is_hydrogen(int i,int j) {
return (i%4 == 3 && j%4 == 3) || (i%4 == 1 && j%4 == 1);
} int main()
{
int m;
memset(board,0,sizeof(board));
int id = 0;
while (scanf("%d",&m) && m) {
if (id)
printf("\n");
printf("Case %d:\n\n",++id);
memset(link_cnt,false,sizeof(link_cnt));
int h = m*4-1, w = m*4+3;
for (int i = 0;i < h; ++i)
for (int j = 0;j < w; ++j) {
if (is_border(h,w,i,j))
board[i][j] = '*';
else if (is_oxygen(i,j))
board[i][j] = 'O';
else if (is_hydrogen(i,j))
board[i][j] = 'H';
else
board[i][j] = ' ';
}
for (int i = 0;i < m; ++i)
for (int j = 0;j < m; ++j) {
scanf("%d",in[i]+j);
if (in[i][j] == 1) {
board[4*i+1][4*j+2] = '-'; link_cnt[4*i+1][4*j+1] = 1;
board[4*i+1][4*j+4] = '-'; link_cnt[4*i+1][4*j+5] = 1;
link_cnt[4*i+1][4*j+3] = 2;
} else if (in[i][j] == -1) {
board[4*i][4*j+3] = '|'; link_cnt[4*i-1][4*j+3] = 1;
board[4*i+2][4*j+3] = '|'; link_cnt[4*i+3][4*j+3] = 1;
link_cnt[4*i+1][4*j+3] = 2;
}
}
// 1型氢原子,水平短线连接
for (int i = 1;i < h; i += 4)
for (int j = 1;j < w; j += 4) {
if (link_cnt[i][j]) continue;
if ((j > 3) && (link_cnt[i][j-2] == 0)) {
board[i][j-1] = '-';
++link_cnt[i][j-2];
link_cnt[i][j] = 1;
} else if ((j + 2 < w) && (link_cnt[i][j+2] == 0)) {
board[i][j+1] = '-';
++link_cnt[i][j+2];
link_cnt[i][j] = 1;
} else {
//cout<<i<<","<<j<<endl;
throw 5.0;
}
}
// 2型 竖直线连接
for (int i = 3;i < h; i += 4)
for (int j = 3;j < w; j += 4) {
if (link_cnt[i][j]) continue;
if (link_cnt[i-2][j] == 1) {
board[i-1][j] = '|';
++link_cnt[i-2][j];
link_cnt[i][j] = 1;
} else if (link_cnt[i+2][j] == 1) {
board[i+1][j] = '|';
++link_cnt[i+2][j];
link_cnt[i][j]= 1;
} else {
//cout<<i<<","<<j<<endl;
throw "wrong";
}
}
for (int i = 0;i < h; ++i) {
board[i][w] = 0;
puts(board[i]);
}
}
return 0;
}

POJ 1099 Square Ice 连蒙带猜+根据样例找规律的更多相关文章

  1. POJ 1099 Square Ice

    Square Ice Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxyg ...

  2. 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)

    题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...

  3. poj 1099

    http://poj.org/problem?id=1099 #include<stdio.h> #include<string.h> #include <iostrea ...

  4. [ACM_其他] Square Ice (poj1099 规律)

    Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxygen at the v ...

  5. DFS POJ 2362 Square

    题目传送门 /* DFS:问能否用小棍子组成一个正方形 剪枝有3:长的不灵活,先考虑:若根本构不成正方形,直接no:若第一根比边长长,no 这题是POJ_1011的精简版:) */ #include ...

  6. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  7. 【poj 1182】食物链(图论--带权并查集)

    题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...

  8. POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律

    http://poj.org/problem?id=1740 这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律…… 博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系, ...

  9. 最简单的基于FFmpeg的移动端样例附件:Android 自带播放器

    ===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...

随机推荐

  1. Android之ScrollView嵌套ListView冲突 (listView只显示一行)

    在ScrollView中嵌套使用ListView,ListView只会显示一行多一点.两者进行嵌套,即会发生冲突.由于ListView本身都继承于ScrollView,一旦在ScrollView中嵌套 ...

  2. AndroidStudio更新时报错:Connection Error,Temp directory inside installation

    场景 在将Android Studio的 .AndroidStudio目录修改为别的目录后,打开AS,提示更新,点击更新后提示: Connection Error,Temp directory ins ...

  3. webStorm 2019 激活码,phpStorm 2019激活,idea激活,pyCharm激活【永久使用】

    [2020-01-16 亲测可用] 无废话版!----直接激活 [麻烦激活后,在评论发表:eg:2020-01-11 09:00 测试可用],有问题直接反馈 我及时修改,建议收藏此博客 都能永久激活, ...

  4. asp.net abp模块化开发之通用树2:设计思路及源码解析

    一.前言 上一篇大概说了下abp通用树形模块如何使用,本篇主要分析下设计思路. 日常开发中会用到很多树状结构的数据,比如:产品的多级分类.省市区县,大多数系统也会用到类似“通用字典/数据字典”的功能, ...

  5. PHPJN0001:phpmyadmin 允许密码为空 设置

    phpmyadmin连接mysql数据库,出于安全考虑,默认不允许使用空密码连接数据库.因为数据库一般都设置密码访问. 但如果只是本机环境测试使用,每隔一段时间都需要填写密码,不是很方便. 如果没有修 ...

  6. 笔记-Git基础

    git配置 git config --global user.name "xxx" //配置用户名 git config --global user.email "xxx ...

  7. modbus 协议说明及常用格式

    --- 说明: modbus协议一般适用于一个主设备访问多个从设备的硬件开发环境,类似于zigbee网络中的一个路由器多个协调器的一对多模型. modbus常用的寄存器类型为 3X 保持寄存器和 4X ...

  8. c#画图之雷达图

    public JsonResult DrawRadar() { List<Color> colors = new List<Color>() { Color.FromArgb( ...

  9. 第2章 在 HTML中 使用 JavaScript

    第2章 在 HTML中 使用 JavaScript 2.1 script 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML中的使用 2.1.5 不推荐 ...

  10. luogu P3384 【模板】重链剖分

    参考https://www.cnblogs.com/wushengyang/p/10808505.html,感谢 #include<iostream> #include<algori ...