AOJ 708.序列匹配

Time Limit: 5000 ms   Memory Limit: 128 MB
Total Submission: 146   Submission Accepted: 34
 
Description
给定两个长度均为3的数字序列,每位上为一个范围是1-N的正整数,求有多少个仍然由3个1-N的整数构成的数字序列能与给定的两个序列中的任意一个匹配。
如果两个序列匹配,当且仅当两个序列中的每个对应数字的最近距离不超过2。
比如当N为9时,每一位数字可能是1,2,3,4,5,6,7,8,9,并且数字是循环的。也就是说9和1是相邻的。
数字之间的距离就是两个数字的位置之差。
也就是说在上面的例子中,9和1的最近距离是1,9和2的最近距离是2,2和5的最近距离是3。
比如现在给定两个序列组合为(1,2,3)和(4,5,6), (2,4,8)或者(1, N, 5) 是能和两个序列匹配中的至少一个匹配的,但是(1, 5, 6)是不能和给定的两个序列中的任何一个匹配的。

 

Input
多组输入,以EOF结束。
每组输入包含三行第一行为一个整数N(1 <= N <= 50),第二行和第三行都是以三个空格分隔的整数。

 

Output
对于每组输入,输出一个数字,表示能和给定的两个序列中的任意一个匹配的序列的个数。

 

Sample Input
Original Transformed
50
1 2 3
5 6 7

 

Sample Output
Original Transformed
249

 

Source
Roll

建立一个三维坐标系,把能覆盖到的地方全部标记上,然后计算数量

其中要注意小于等于0和大于N的情况(转换后还应该在0-N之间)。

 1 /*
 2 By:OhYee
 3 Github:OhYee
 4 Email:oyohyee@oyohyee.com
 5 */
 6 #include <cstdio>
 7 #include <algorithm>
 8 #include <cstring>
 9 #include <cmath>
10 #include <string>
11 #include <iostream>
12 #include <vector>
13 #include <list>
14 #include <queue>
15 #include <stack>
16 using namespace std;
17  
18 #define REP(n) for(int o=0;o<n;o++)
19  
20 const int maxn = 55;
21  
22  
23 bool Do() {
24     int N,a1,b1,c1,a2,b2,c2;
25     int cnt = 0;
26     if(scanf("%d%d%d%d%d%d%d",&N,&a1,&b1,&c1,&a2,&b2,&c2) == EOF)
27         return false;
28  
29     bool map[maxn][maxn][maxn] = {0};
30  
31     for(int x = a1 - 2;x <= a1 + 2;x++)
32         for(int y = b1 - 2;y <= b1 + 2;y++)
33             for(int z = c1 - 2;z <= c1 + 2;z++) {
34                 int xx = x <= 0 ? N + x : x > N ? x - N : x;
35                 int yy = y <= 0 ? N + y : y > N ? y - N : y;
36                 int zz = z <= 0 ? N + z : z > N ? z - N : z;
37                 if(!map[xx][yy][zz] && xx > 0 && xx <= N&&yy > 0 && yy <= N&&zz > 0 && zz <= N)
38                     cnt++;
39                 map[xx][yy][zz] = 1;
40             }
41     for(int x = a2 - 2;x <= a2 + 2;x++)
42         for(int y = b2 - 2;y <= b2 + 2;y++)
43             for(int z = c2 - 2;z <= c2 + 2;z++) {
44                 int xx = x <= 0 ? N + x : x > N ? x - N : x;
45                 int yy = y <= 0 ? N + y : y > N ? y - N : y;
46                 int zz = z <= 0 ? N + z : z > N ? z - N : z;
47                 if(!map[xx][yy][zz] && xx > 0 && xx <= N&&yy > 0 && yy <= N&&zz > 0 && zz <= N)
48                     cnt++;
49             }
50     printf("%d\n",cnt);
51     return true;
52 }
53  
54  
55 int main() {
56     while(Do());
57     return 0;
58 }

 

posted @ 2016-03-12 20:04  OhYee  阅读(256)  评论(0编辑  收藏  举报