Origami

[提交] [状态] [讨论版] [命题人:admin]

题目描述

Master Grus is a famous origami (paper folding) artist, who is enthusiastic about exploring the possibility of origami art. For future creation, he is now planning fundamental experiments to establish the general theory of origami.
One rectangular piece of paper is used in each of his experiments. He folds it horizontally and/or vertically several times and then punches through holes in the folded paper.
The following figure illustrates the folding process of a simple experiment, which corresponds to the third dataset of the Sample Input below. Folding the 10 × 8 rectangular piece of paper shown at top left three times results in the 6 × 6 square shape shown at bottom left. In the figure, dashed lines indicate the locations to fold the paper and round arrows indicate the directions of folding. Grid lines are shown as solid lines to tell the sizes of rectangular shapes and the exact locations of folding. Color densities represent the numbers of overlapping layers. Punching through holes at A and B in the folded paper makes nine holes in the paper, eight at A and another at B.

Your mission in this problem is to write a computer program to count the number of holes in the paper, given the information on a rectangular piece of paper and folding and punching instructions.
 

输入

The input consists of at most 1000 datasets, each in the following format.
n m t p
d1 c1 
... 
dt ct 
x1 y1 
... 
xp yp 
n and m are the width and the height, respectively, of a rectangular piece of paper. They are positive integers at most 32. t and p are the numbers of folding and punching instructions, respectively. They are positive integers at most 20. The pair of di and ci gives the i-th folding instruction as follows:
di is either 1 or 2.
ci is a positive integer.
If di is 1, the left-hand side of the vertical folding line that passes at ci right to the left boundary is folded onto the right-hand side.
If di is 2, the lower side of the horizontal folding line that passes at ci above the lower boundary is folded onto the upper side.
After performing the first i−1 folding instructions, if di is 1, the width of the shape is greater than ci. Otherwise the height is greater than ci. (xi + 1/2, yi + 1/2) gives the coordinates of the point where the i-th punching instruction is performed. The origin (0, 0) is at the bottom left of the finally obtained shape. xi and yi are both non-negative integers and they are less than the width and the height, respectively, of the shape. You can assume that no two punching instructions punch holes at the same location.
The end of the input is indicated by a line containing four zeros.

 

输出

For each dataset, output p lines, the i-th of which contains the number of holes punched in the paper by the i-th punching instruction.

 

样例输入

2 1 1 1
1 1
0 0
1 3 2 1
2 1
2 1
0 0
10 8 3 2
2 2
1 3
1 1
0 1
3 4
3 3 3 2
1 2
2 1
1 1
0 1
0 0
0 0 0 0

 

样例输出

2
3
8
1
3
6

大致题意:给你一个n*m的方格,操作 t 次,每次操作中如果di=1,表示向右翻折 ci 个格子。

如果di=2,表示向上翻折 ci 个格子,然后进行p次访问,看当前的 格子的 ( xi , yi ) 处有几层。

 

按题意操作,处理好边界即可。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long int
ll hang[10010],lie[10010];
int main()
{
	int n,m,t,p,u,v,x,y;
	while(scanf("%d %d %d %d",&n,&m,&t,&p)!=EOF&&n!=0){
		
		memset(hang,0,sizeof(hang));
		for(int i=0;i<n;i++)
			hang[i]=1;
		memset(lie,0,sizeof(lie));
		for(int i=0;i<m;i++)
			lie[i]=1;
		
		x=0; y=0;
		while(t--){
			scanf("%d %d",&u,&v);
			if(u==1){
				for(int i=0;i<v;i++)
					hang[x+v*2-i-1]+=hang[x+i];
				x+=v;
			}
			else{
				for(int i=0;i<v;i++)
					lie[y+v*2-i-1]+=lie[y+i];
				y+=v;
			}
		}
		
		while(p--){
			scanf("%d %d",&u,&v);
			printf("%lld\n",hang[x+u]*lie[y+v]);
		}
		
	}
	
	
	return 0;
 } 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值