poj 1099

http://poj.org/problem?id=1099

#include<stdio.h>
#include<string.h>
#include <iostream>

using namespace std;
#define N 60

int x,y,n;
char mat[N][N];

struct node
{
    int num,id;
    int hang,lie;
} map[N][N];

void init()
{
    int i,j;
    memset(mat,0,sizeof(mat));
    for(i=1; i<=x; i++) //空格 和 ‘*‘
    {
        for(j=1; j<=y; j++)
        {
            if(i==1 || i==x || j==1 || j==y) mat[i][j]=‘*‘;
            else mat[i][j]=‘ ‘;
        }
    }
    for(i=2; i<x; i=i+4) //H原子
    {
        for(j=2; j<y; j=j+4)
            mat[i][j]=‘H‘;
    }
    for(i=4; i<x; i=i+4) //H原子
    {
        for(j=4; j<y; j=j+4)
            mat[i][j]=‘H‘;
    }
    for(i=2; i<x; i=i+4) //O原子
    {
        for(j=4; j<y; j=j+4)
            mat[i][j]=‘O‘;
    }
}
void putmat()
{
    int i,j;
    for(i=1; i<=x; i++)
    {
        for(j=1; j<=y; j++)
            printf("%c",mat[i][j]);
        puts("");
    }
}
int main()
{
    int i,j,h,g,time=1;
    while(scanf("%d",&n),n)
    {
        if(time>1)puts("");
        memset(map,0,sizeof(map));
        y=4*n+3, x=4*n-1;//x行数,y列数
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                scanf("%d",&map[i][j].num);
                map[i][j].id=n*(i-1)+j;
                map[i][j].hang=map[i][j].lie=map[i][j].num;
                map[i][j].hang+=map[i][j-1].hang;
                map[i][j].lie+=map[i-1][j].lie;
            }
        }

        init();
        int k=1;
        for(i=1; i<=x; i++)
        {
            for(j=1; j<=y; j++)
            {
                if(mat[i][j]==‘O‘)
                {
                    int find=0;
                    for(h=1; h<=n; h++)
                    {
                        for(g=1; g<=n; g++)
                            if(map[h][g].id==k)
                            {
                                find=1,k++;
                                break;
                            }
                        if(find)break;
                    }
                    if(map[h][g].num==1) mat[i][j-1]=‘-‘,mat[i][j+1]=‘-‘;
                    else if(map[h][g].num==-1) mat[i-1][j]=‘|‘,mat[i+1][j]=‘|‘;
                    else if(map[h][g].num==0)
                    {
                        if(map[h][g].hang==0) mat[i][j-1]=‘-‘;
                        else if(map[h][g].hang==1) mat[i][j+1]=‘-‘;
                        if(map[h][g].lie==0) mat[i+1][j]=‘|‘;
                        else if(map[h][g].lie==1) mat[i-1][j]=‘|‘;
                    }
                }
            }
        }
        printf("Case %d:\n\n",time++);
        putmat();
    }
    return 0;
}

找规律:

题目要求输出的图中如果先不管 H-O 键的话,也就是说光看 H 和 O 原子的话,它们的位置是有规律的,H 原子分两种,一种是从点(2,2)开始横,纵坐标分别以 4 递增,另一种是从点(4,4)开始横,纵坐标分别以 4 递增。而 O 原子的个数就是 n*n ,从(2,4)开始,以 4 递增。我们可以先画出一张没有 H-O 键的图来,然后在根据 数字矩阵中的值,给每一个 O 原子加上两个 H-O 键就可以了。

最后加上 H-O 键的时候,按 数字矩阵 分3种情况,1 和 -1 时,很好处理,关键是 0 的时候。仔细看题,有这么一句话: ……the sum of each row and column is 1  ……

就是这句了,解题点,根据 数字矩阵 中该行(或列)上 从开始到现在的点的数值和,可以判断,这个 H-O 键的方向:

上下:该列第一行到该行的数值和,0代表 H-O 在这个 O 原子下面,1是上。

左右:该行第一列到该列的数值和,0代表 H-O 在这个 O 原子左面,1是右。

时间: 2024-08-18 04:26:10

poj 1099的相关文章

POJ 3449 Geometric Shapes --计算几何,线段相交

题意: 给一些多边形或线段,输出与每一个多边形或线段的有哪一些多边形或线段. 解法: 想法不难,直接暴力将所有的图形处理成线段,然后暴力枚举,相交就加入其vector就行了.主要是代码有点麻烦,一步一步来吧. 还有收集了一个线段旋转的函数. Vector Rotate(Point P,Vector A,double rad){ //以P为基准点把向量A旋转rad return Vector(P.x+A.x*cos(rad)-A.y*sin(rad),P.y+A.x*sin(rad)+A.y*co

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

Number Sequence POJ 1019

给定一个字符串满足规律 11212312345--,求其第k位的数字. 算法思路: 分组来看,第一组1 第二组12 第三组123 第K组[1:k] 1-9组每组1位, 10-99组每组2位 依次类推. 网上大部分解法,用一个数组表示到第k组时,一共需要多少位数,但这个方法需要额外的空间,而且空间大小并不是非常容易确定. 伪代码的思路:sum 表示 while true last-sum = sum; group-size = last-group-size + member-size; // 本

转载:poj题目分类(侵删)

转载:from: POJ:http://blog.csdn.net/qq_28236309/article/details/47818407 按照ac的代码长度分类(主要参考最短代码和自己写的代码) 短代码:0.01K–0.50K:中短代码:0.51K–1.00K:中等代码量:1.01K–2.00K:长代码:2.01K以上. 短:1147.1163.1922.2211.2215.2229.2232.2234.2242.2245.2262.2301.2309.2313.2334.2346.2348

POJ 3286 How many 0&#39;s?(多少0?)

POJ 3286 How many 0's?(多少0?) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A Benedict monk No.16 writes down the decimal representations of all natural numbers between and including m and n, m ≤ n. How many 0's will he write down? 一个

poj题库分类

初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,hea

POJ题目(转)

http://www.cnblogs.com/kuangbin/archive/2011/07/29/2120667.html 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (