序列匹配

来源:互联网 发布:斯皮尔伯格知乎 编辑:程序博客网 时间:2024/05/17 03:43
Time Limit: 5000 ms   Memory Limit: 128 MB
Total Submission: 13   Submission Accepted: 9
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
OriginalTransformed
501 2 35 6 7
50[EOL] 1[SP]2[SP]3[EOL] 5[SP]6[SP]7[EOL] [EOF] 

Sample Output
OriginalTransformed

249


在这题第一次用到了三维数组
#include<cstdio>#include<cmath>#include<cstring>#include<string>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<sstream>#include<map>//#define DEBUGconst int maxn = 55;using namespace std;int main() {#ifdef DEBUGfreopen("Text.txt", "r", stdin);#endif // DEBUGcin.tie(0);cin.sync_with_stdio(false);int n;while (scanf("%d",&n)!=EOF) {bool arr[maxn][maxn][maxn];memset(arr, 0, sizeof(arr));int a1, b1, c1, a2, b2, c2;int sum = 0;scanf("%d%d%d", &a1, &b1, &c1);scanf("%d%d%d", &a2, &b2, &c2);int i, j, k;for(i=a1-2;i<=a1+2;i++)for(j=b1-2;j<=b1+2;j++)for (k = c1 - 2; k <= c1 + 2; k++) {int x = i < 1 ? (i + n) : (i > n) ? i - n : i;int y = j < 1 ? (j + n) : (j > n) ? j - n : j;int z = k < 1 ? (k + n) : (k > n) ? k - n : k;if (arr[x][y][z] == 0 && x>0 && x <= n && y>0 && y <= n && z > 0 && z <= n) {arr[x][y][z] = 1;sum++;}}for (i = a2 - 2; i <= a2 + 2; i++)for (j = b2 - 2; j <= b2 + 2; j++)for (k = c2 - 2; k <= c2 + 2; k++) {int x = i < 1 ? (i + n) : (i > n) ? i - n : i;int y = j < 1 ? (j + n) : (j > n) ? j - n : j;int z = k < 1 ? (k + n) : (k > n) ? k - n : k;if (arr[x][y][z] == 0 && x>0 && x <= n && y>0 && y <= n && z > 0 && z <= n) {arr[x][y][z] = 1;sum++;}}printf("%d\n", sum);}return 0;}


0 0
原创粉丝点击