UVA 1156 - Pixel Shuffle(模拟+置换)
UVA 1156 - Pixel Shuffle
题意:依据题目中的变换方式,给定一串变换方式,问须要运行几次才干回复原图像
思路:这题恶心的一比,先模拟求出一次变换后的相应的矩阵,然后对该矩阵求出全部循环长度,全部循环长度的公倍数就是答案
代码:
#include <stdio.h>
#include <string.h> const int N = 1100;
int t, n, g[N][N], vis[N][N], save[N][N];
char str[N], s[N]; void rot(int flag) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!flag)
save[i][j] = g[n - j - 1][i];
else
save[n - j - 1][i] = g[i][j];
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void sym(int flag) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
save[i][j] = g[i][n - j - 1];
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void bhsym(int flag) {
for (int i = 0; i < n / 2; i++) {
for (int j = 0; j < n; j++)
save[i][j] = g[i][j];
}
for (int i = n / 2; i < n; i++)
for (int j = 0; j < n; j++)
save[i][j] = g[i][n - j - 1];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void bvsym(int flag) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i < n / 2) save[i][j] = g[i][j];
else save[i][j] = g[3 * n / 2 - 1 - i][j];
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void div(int flag) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!flag) {
if (i % 2) save[i][j] = g[i / 2 + n / 2][j];
else save[i][j] = g[i / 2][j];
}
else {
if (i % 2) save[i / 2 + n / 2][j] = g[i][j];
else save[i / 2][j] = g[i][j];
}
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void mix(int flag) {
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i % 2 == 0){
if (flag) {
if (j % 2 == 0) save[i][j] = g[i][j / 2];
else save[i][j] = g[i + 1][j / 2];
}
else {
if (j % 2 == 0) save[i][j / 2] = g[i][j];
else save[i + 1][j / 2] = g[i][j];
}
}else{
if (flag) {
if(j % 2 == 0) save[i][j] = g[i - 1][n / 2 + j / 2];
else save[i][j] = g[i][n / 2 + j / 2];
}
else {
if(j % 2 == 0) save[i - 1][n / 2 + j / 2] = g[i][j];
else save[i][n / 2 + j / 2] = g[i][j];
}
}
}
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
g[i][j] = save[i][j];
} void change(char *str) {
int len = strlen(str);
int flag = 1;
if (str[0] == '-') {
flag = 0;
str++;
}
if (strcmp(str, "tor") == 0) rot(flag);
else if (strcmp(str, "mys") == 0) sym(flag);
else if (strcmp(str, "myshb") == 0) bhsym(flag);
else if (strcmp(str, "mysvb") == 0) bvsym(flag);
else if (strcmp(str, "vid") == 0) div(flag);
else if (strcmp(str, "xim") == 0) mix(flag);
} void tra() {
int len = strlen(str);
int sn = 0;
for (int i = len - 1; i >= 0; i--) {
if (str[i] == ' ') {
s[sn] = '\0';
change(s);
sn = 0;
}
else {
s[sn++] = str[i];
}
}
s[sn] = '\0';
change(s);
} int gcd(int a, int b) {
if (!b) return a;
return gcd(b, a % b);
} int lcm(int a, int b) {
return a / gcd(a, b) * b;
} int solve() {
int ans = 1;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!vis[i][j]) {
vis[i][j] = 1;
int cnt = 1;
int x = g[i][j] / n;
int y = g[i][j] % n;
while (!vis[x][y]) {
cnt++;
vis[x][y] = 1;
int t = g[x][y] / n;
y = g[x][y] % n;
x = t;
}
ans = lcm(ans, cnt);
}
}
}
return ans;
} void init() {
scanf("%d", &n);
getchar();
gets(str);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
g[i][j] = i * n + j;
}
}
} int main() {
scanf("%d", &t);
while (t--) {
init();
tra();
printf("%d\n", solve());
if (t) printf("\n");
}
return 0;
}
UVA 1156 - Pixel Shuffle(模拟+置换)的更多相关文章
- uva 10710 - Chinese Shuffle(完美洗牌)
option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...
- LA 3510 (置换 循环分解) Pixel Shuffle
思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A分解循环,m则等于所有循环节长 ...
- UVALive - 3510 Pixel Shuffle (置换)
题目链接 有一个n*n的图像和7种置换,以及一个置换序列,求将这个序列重复做几次能得到原图像. 将这些置换序列乘起来可得到一个最终置换,这个置换所有循环节的长度的lcm即为答案. 注意置换是从右往左进 ...
- UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA 12050 - Palindrome Numbers 模拟
题目大意:给出i,输出第i个镜像数,不能有前导0. 题解:从外层开始模拟 #include <stdio.h> int p(int x) { int sum, i; ;i<=x;i+ ...
- Uva 679 Dropping Balls (模拟/二叉树的编号)
题意:有一颗二叉树,深度为D,所有节点从上到下从左到右编号为1,2,3.....在结点一处放一个小球,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k ...
- ●UVa 1589 Xiangqi(模拟)
●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...
- 【每日一题】 UVA - 213 Message Decoding 模拟解码+读入函数+阅读题
题意:阅读理解难度一道比一道难orz.手摸了好久样例 题解: 读入:大循环用getline读入header顺便处理一下, 里面再写两重循环,外层一次读三个串,内层一次读num个串. 之后就查表,线性 ...
- LA3510 Pixel Shuffle
题意 PDF 分析 思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用\(O(n^2k)\)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A ...
随机推荐
- C语言编程入门——程序练习(下)
C语言的一些简单操作练习. 互换两个数字: # include <stdio.h> int main(void) { int i = 3; int j = 5; int t; //将i ...
- sql之group by的用法
1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.原始表 3.简 ...
- 错误 make: Nothing to be done for 'default'
Makefile书写格式非常严格,all:<TAB缩进>make -C $(KDIR) M=$(PWD) $(EXTRA_CFLAGS) modulesdefault:<TAB缩进& ...
- POJ 1320 Street Numbers Pell方程
http://poj.org/problem?id=1320 题意很简单,有序列 1,2,3...(a-1),a,(a+1)...b 要使以a为分界的 前缀和 和 后缀和 相等 求a,b 因为序列很 ...
- 王小川分享AI
王小川的分享:Link
- AndroidStudio MAT LeakCanary 内存分析之 LeakCanary
现在我们换一种更清晰方便的方式:LeakCanary https://github.com/square/leakcanary 首先将LeakCanary绑在我们的app上 build.gradle ...
- 00089_字节输出流OutputStream
1.字节输出流OutputStream (1)OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法: (2)输出流中定义都是写wri ...
- Java Web学习总结(5)——HttpServletResponse对象详解
一.HttpServletResponse常见应用--生成验证码 1.1.生成随机图片用作验证码 生成图片主要用到了一个BufferedImage类, 生成随机图片范例: package gacl.r ...
- zeromq and jzmq
install c test install jzmq java test Storm UI Cluster Summary Version Nimbus uptime Supervisors Use ...
- ajax中打开新页面使用window.open方法被拦截的解决方法
$('.testA').unbind('click').bind('click',function(){ var result=""; $.ajax({ url:'http://l ...