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 ...
随机推荐
- springmvc maven idea 多模块开发(四):建立Web子模块
先建立web的父模块,其他子web模块建立在该父模块之下,该模块打包方式选择为pom 建立实际web模块,右键点击web-parent,建立方法同上,打包方式为war 建立好后的目录结构如下: 手工建 ...
- 1994_An Algorithm To Reconstruct Wideband Speech From Narrowband Speech Based On Codebook Mapping
论文地址:基于码本映射的窄带语音宽带重建算法 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/12144324.html 摘要 本文提出了一种从窄带 ...
- 802.11有线等效加密WEP
有线等效加密(WEP)标准是802.11无线安全早期的解决方案,WEP并不安全. 既然WEP并不安全,为什么还要学习WEP呢? WEP简单,相比后续出现的加密协议,它不要求有多么强大的计算能力.一些老 ...
- 彻底理解Windows认证1
彻底理解Windows认证 一.Windows本地认证 1. 我的密码在哪里? 路径:C:\Windows\System32\config\SAM 当我们登录系统的时候,系统会自动的读取SAM文件中的 ...
- vim配置markdown预览
注:系统为Centos7,安装了gnome桌面环境. 我的vim装了vimplus工具包,看代码一等一的方便,但是看md的时候还是有些不快乐.于是想找个插件实现markdown的预览. 尝试了几个vi ...
- [Contract] Solidity 遍历 mapping 的一种方式
思路:为需要遍历的 mapping 再准备一个 list,之后通过 for 循环遍历 list 取得 mapping 的 key. mapping (address => uint) users ...
- 【python基础语法】第7天作业练习题
import keyword ''' # 第一题:简单题 1.什么是全局变量? 2.什么是局部变量? 3.函数内部如何修改全局变量(如何声明全局变量 )? 4.写出已经学过的所有python关键字,分 ...
- python生日贺卡制作以及细节问题的解决最后把python项目发布为exe可执行程序过程
自己今天第一次做一个python生日贺卡: 效果图 参考之前有位大佬的作品,自己稍微的改造了一下下 首先:上程序 Birthday.py """ ----------- ...
- 飘扬的旗帜!shader 编程实战!Cocos Creator!
用 shader + mesh 立个 flag 吧! 文章底部获取完整代码! 效果预览 使用方法 创建一个空节点 添加用户脚本组件 mesh-texture-flag 添加图片 修改对应属性 实现原理 ...
- [Linux] git add时的注意事项
git add -A 提交所有变化 git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new) git add . 提交新文件(new)和被修改( ...