[ACM_其他] Square Ice (poj1099 规律)
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
Output
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
题目的大致意思就是给你一个矩阵,里面包含有1,-1,或者0,分别代表三种水分子的排列方式,现在要求根据矩阵来还原水分子的排列,并在周围加上一圈的“*”。仔细观察会发现其实H和O的分布是不变的,唯一不同的是氢氧建的位置,我首先把H和O的位置放好,然后分别根据横竖排列限制确定某些H(这里游离H用4表示,非游离的用5来表示),然后针对非竖非横的排列情况单独分析该氧元素周围4个氢原子的情况。(特别说明:这里用square[i][j]来标记(i,j)位置的对应符号,最后才把结果输出来)
#include<iostream>
#include<string.h>
using namespace std;
int n,ASM[][],square[][];//square[][]用来存放结果符号映射,其中set[square[i][j]]即为i,j位置的符号
char set[]={' ','-','|','O','H','H'};//4代表游离H,5代表固定H
bool Valid(int i,int j){return (<=i&&i<*n-&&<=j&&j<*n+);}
void output(){
for(int i=;i<*n+;i++) cout<<'*';cout<<'\n';//输出第一行的4n+3个*
for(int i=;i<*n-;i++){//中间图像
cout<<'*';
for(int j=;j<*n+;j++)cout<<set[square[i][j]];
cout<<'*'<<'\n';
}
for(int i=;i<*n+;i++) cout<<'*';cout<<'\n';//输出最后一行的4n+3个*
}
void solve(){
memset(square,,sizeof(square));
for(int i=;i<n;i++){
for(int j=;j<n;j++){
square[*i][*j+]=;square[*i][*j+]=;
if(j==) square[*i][*j]=;
if(i<n-) square[*i+][*j+]=; //氧氢位置是固定的,变化的是连线!!! if(ASM[i][j]==){//横着
square[*i][*j+]=square[*i][*j+]=;
square[*i][*j]=square[*i][*j+]=;
}
else if(ASM[i][j]==-){//竖着(不用考虑越界因为i不可能为0)
square[*i-][*j+]=square[*i+][*j+]=;
square[*i-][*j+]=square[*i+][*j+]=;
}
}
}
for(int i=;i<n;i++){//其他情况配对
for(int j=;j<n;j++){
if(ASM[i][j]==){//对i,j周围4个H进行判断,并固定其中游离的H
if(Valid(*i,*j)&&square[*i][*j]!=)
square[*i][*j]=, square[*i][*j+]=;
else if(Valid(*i,*j+)&&square[*i][*j+]!=)
square[*i][*j+]=, square[*i][*j+]=;
if(Valid(*i-,*j+)&&square[*i-][*j+]!=)
square[*i-][*j+]=, square[*i-][*j+]=;
else if(Valid(*i+,*j+)&&square[*i+][*j+]!=)
square[*i+][*j+]=, square[*i+][*j+]=;
}
}
}
}
int main(){
int casee=;
while(cin>>n && n>){
for(int i=;i<n;i++)
for(int j=;j<n;j++)
cin>>ASM[i][j];
cout<<(casee== ? "":"\n");
cout<<"Case "<<casee++<<":\n\n";
solve();
output();
}return ;
}
//poj1099
[ACM_其他] Square Ice (poj1099 规律)的更多相关文章
- POJ 1099 Square Ice 连蒙带猜+根据样例找规律
目录 题面 思路 思路 AC代码 题面 Square Ice Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4526 A ...
- POJ 1099 Square Ice
Square Ice Description Square Ice is a two-dimensional arrangement of water molecules H2O, with oxyg ...
- ACM_同余+暴力找规律
小光的忧伤 Time Limit: 2000/1000ms (Java/Others) Problem Description: 锴神:我尊重作者原意,你们出什么我就加什么.于是小光打了道水题(也就是 ...
- POJ题目细究
acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP: 1011 NTA 简单题 1013 Great Equipment 简单题 102 ...
- 【转】POJ百道水题列表
以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight ...
- POJ题目排序的Java程序
POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...
- 狗狗40题~(Volume A)
A - The Willy Memorial Program 大模拟题…… 一开始的思路不对,修修补补WA了十发.当时想直接一个并查集做连通来搞定它,结果发现不能很好地判断各管的水位.究其原因还是因为 ...
- Codeforces 715A & 716C Plus and Square Root【数学规律】 (Codeforces Round #372 (Div. 2))
C. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- [ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)
Description ycc 喜欢古典音乐是一个 ZJUTACM 集训队中大家都知道的事情.为了更方便地聆听音乐,最近 ycc 特意把他的家搬到了爱乐大街(德语Philharmoniker-Stra ...
随机推荐
- java基础十二[集合与泛型](阅读Head First Java记录)
集合 List 知道索引顺序的集合,ArrayList.LinkedList.Vector三个子类实现了List接口 ArrayList ArrayList没有排序方法,可以用Collection ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十五 ) CommsThreadPool自定义线程池
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- 【Python全栈笔记】00 12-14 Oct Linux 和 Python 基础
Linux 基础认识 更加稳定,安全,开源 设置好ssh协议后可以通过windows系统连接Linux,基于ssh协议进行通信 '/' 为根目录 cd / -> 切换到根目录 ls -lh 列出 ...
- [2015hdu多校联赛补题]hdu5299 Circles Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5299 题意: 在欧几里得平面上有n个圆,圆之间不会相交也不会相切,现在Alice和Bob玩游戏,两人轮 ...
- 2.Java对象创建
1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类 ...
- web storage的用法
Web Storage分为两种: sessionStorage localStorage 从字面意思就可以很清楚的看出来,sessionStorage将数据保存在session中,浏览器关闭也就没了: ...
- 解决winrar压缩软件弹出广告
最近winrar每次打开压缩包就会弹出一个广告,那是因为winrar是收费软件,注册了就没有广告了.下面我教大家怎么注册来屏蔽广告. 解决方法 1.新建一个txt文件并命名为"rarreg. ...
- 問題排查:F5啟動偵錯後所提示的錯誤 (1)
原始專案版本:Visual Studio 2005 開發環境:Visual Studio 2013 偵錯運行環境:IIS Express 啟動偵錯後,錯誤提示內容如下: HTTP 错误 500.23 ...
- rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>
大概思路如下: 使用Linux自带的rsyslog服务来做底层,然后再使用mysql与rsyslog的模板来存储文件,并且以web来进行显示出来.<模板的存储以日期的树形结构来存储,并且以服务器 ...
- 统计学习方法笔记(KNN)
k近邻法(k-nearest neighbor,k-NN) 输入:实例的特征向量,对应于特征空间的点:输出:实例的类别,可以取多类. 分类时,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预 ...