POJ 1099 Square Ice 连蒙带猜+根据样例找规律
目录
题面
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 连蒙带猜+根据样例找规律的更多相关文章
- POJ 1099 Square Ice
Square Ice Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxyg ...
- 【poj 3090】Visible Lattice Points(数论--欧拉函数 找规律求前缀和)
题意:问从(0,0)到(x,y)(0≤x, y≤N)的线段没有与其他整数点相交的点数. 解法:只有 gcd(x,y)=1 时才满足条件,问 N 以前所有的合法点的和,就发现和上一题-- [poj 24 ...
- poj 1099
http://poj.org/problem?id=1099 #include<stdio.h> #include<string.h> #include <iostrea ...
- [ACM_其他] Square Ice (poj1099 规律)
Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxygen at the v ...
- DFS POJ 2362 Square
题目传送门 /* DFS:问能否用小棍子组成一个正方形 剪枝有3:长的不灵活,先考虑:若根本构不成正方形,直接no:若第一根比边长长,no 这题是POJ_1011的精简版:) */ #include ...
- POJ 1182 食物链 [并查集 带权并查集 开拓思路]
传送门 P - 食物链 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit ...
- 【poj 1182】食物链(图论--带权并查集)
题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...
- POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律
http://poj.org/problem?id=1740 这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律…… 博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系, ...
- 最简单的基于FFmpeg的移动端样例附件:Android 自带播放器
===================================================== 最简单的基于FFmpeg的移动端样例系列文章列表: 最简单的基于FFmpeg的移动端样例:A ...
随机推荐
- 获取出口IP地址
curl https://www.ipaddress.com/ |grep "My IPv4 Address" # 推荐 curl icanhazip.com curl www.t ...
- [Python]random生成随机6位验证码
#!/usr/bin/env pyhton # coding:utf-8 # @Time : 2020-02-16 10:07 # @Author : LeoShi # @Site : # @File ...
- 根据map中的某一key进行排序(快速排序实现)
/** * @author Gaoxl * 根据key值排序,要求key值能够转为Long类型(快速排序) * @param maps * @param key * @return */ public ...
- Http2优点
1.信道复用 2.分帧传输 3.Server Push Http/1.1与Http/2对比网站: https://http2.akamai.com/demo https://http2.akamai. ...
- width、height为auto或者100%的区别
一.规则 1. 某div不设置宽度,那么width默认为auto. 2. 某子元素div的width为100%(或者设置为等于父元素宽度的具体值,比如父元素width为100px,子元素width也设 ...
- Spring ioc(4)---如何解决循环依赖
前面说到对象的创建,那么在创建的过程中Spring是怎么又是如何解决循环依赖的呢.前面提到有个三级缓存.就是利用这个来解决循环依赖.打个比方说实例化A的时候,先将A创建(早期对象)放入一个池子中.这个 ...
- Babel配置中的presets、plugins、各个阶段stage的含义
什么是Babel Babel 官方文档: https://babeljs.io/ Babel 中文文档:https://www.babeljs.cn/ 我们知道各个浏览器对JavaScript版本的支 ...
- 一起了解 .Net Foundation 项目 No.7
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Entity Framew ...
- Linux内存管理解析(三) : 内核对内核空间的内存管理
内核采用 struct page 来表示一个物理页,在其中记载了诸多物理页的属性,比如 物理页被几个线程使用(如若没有则表示该页可以释放),页对应的虚拟地址. 首先需要知道的是,分配物理页可以分为两个 ...
- Couchdb垂直权限绕过到命令执行
0x00couchdb简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查 ...