糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 2434 Waves 模拟

思路:

每个石头可以分为两个波,一个高峰波,一个低谷波。
每个波可以分为很多个水平方向的波。
每个水平方向的波有三种情况,起始点的位置:
1. 位于 B1 左边
2. 位于 B1,B2 中间
3. 位于 B2 右边

其中第2种情况有点麻烦,多次往返的话要一次算完。


代码:
#include <stdio.h>
#include 
<string.h>

int P, B1, B2, R, back_dis, map[16][16];

#define inline

inline 
int min(int a, int b)
{
    
return a < b ? a : b;
}


inline 
int abs(int a)
{
    
return a > 0 ? a : -a;
}


inline 
void put(int x, int y, int h)
{
    
if (x < -4 || x > 4 || y < -4 || y > 4)
        
return ;
    map[y 
+ 4][x + 4+= h;
}


inline 
void left(int x, int y, int t, int h, int dir)
{
    
int i;

    
if (!dir) {
        
// left
        x -= t;
    }
 else {
        
// right
        i = min(t, B1 - x - 1);
        t 
-= i;
        x 
+= i;
        
if (t > 1{
            t
--;
            x 
-= t;
        }

    }

    put(x, y, h);
}


inline 
void right(int x, int y, int t, int h, int dir)
{
    
int i;

    
if (!dir) {
        
// left
        i = min(t, x - B2 - 1);
        t 
-= i;
        x 
-= i;
        
if (t > 1{
            t
--;
            x 
+= t;
        }

    }
 else {
        
// right
        x += t;
    }

    put(x, y, h);
}


inline 
void mid(int x, int y, int t, int h, int dir)
{
    
int i;

    
if (!dir) {
        
// left
        i = min(t, x - B1 - 1);
        t 
-= i;
        x 
-= i;
    }
 else {
        
// right
        i = min(t, B2 - x - 1);
        t 
-= i;
        x 
+= i;
    }

    
    
if (t > 1{
        i 
= t / back_dis;
        
if (i) 
            t 
-= i*back_dis;
    }

    
    
if (!t) {
        put(x, y, h);
        
return ;
    }


    t
--;
    mid(x, y, t, h, 
!dir);
}


inline 
void point(int x, int y, int t, int h, int dir)
{
    
if (x < B1)
        left(x, y, t, h, dir);
    
else if (x > B1 && x < B2)
        mid(x, y, t, h, dir);
    
else
        right(x, y, t, h, dir);
}


inline 
void pair(int x, int y, int t, int h)
{
    
if (t > R)
        
return ;
    
if (t == R) 
        put(x, y, h);
    
else {
        point(x, y, R 
- t, h, 0);
        point(x, y, R 
- t, h, 1);
    }

}


inline 
void wave(int x, int y, int t, int h)
{
    
int i;

    
for (i = -4; i <= 4; i++
        pair(x, i, t 
+ abs(y - i), h);
}


int main()
{
    
int i, x, y, t;

    freopen(
"e:\\test\\in.txt""r", stdin);

    scanf(
"%d%d%d%d"&P, &B1, &B2, &R);
    
    
if (B1 > B2) {
        i 
= B2;
        B2 
= B1;
        B1 
= i;
    }

    back_dis 
= 2*(B2 - B1) - 2;
    
    
while (P--{
        scanf(
"%d%d%d"&x, &y, &t);
        wave(x, y, t, 
1);
        wave(x, y, t 
+ 2-1);
    }


    
for (y = 4; y >= -4; y--{
        
for (x = -4; x <= 4; x++{
            
if (x == B1 || x == B2) {
                putc(
'X', stdout);
                
continue;
            }
 
            i 
= map[y + 4][x + 4];
            
if (i > 0)
                putc(
'*', stdout);
            
else if (i < 0)
                putc(
'o', stdout);
            
else
                putc(
'-', stdout);
        }

        putc(
'\n', stdout);
    }


    
return 0;
}

posted on 2010-04-14 16:57 糯米 阅读(426) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理