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 ...
随机推荐
- 各种join一目了然: join 、inner join、left join 、right join、full join
各种join一幅图一目了然 一下每幅图都是指: A * join B on A.id = B.in 这个帖子也非常形象.比較好:http://www.phpddt.com/db/inner_join- ...
- Leetcode47: Palindrome Linked List
Given a singly linked list, determine if it is a palindrome. 推断一个链表是不是回文的,一个比較简单的办法是把链表每一个结点的值存在vect ...
- js16--自定义原型对象
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 2.2 Consumer API官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ 2.2 Consumer API 2.2.消费者API 随着0..0版本,我们已经增 ...
- element-UI实现el-table-column百分比自定义分配
1.把el-table-column的属性width换位min-width就支持百分比显示了.
- LoadRunner IP欺骗使用
- Java经典23种设计模式之行为型模式(二)
本文接着介绍行为型模式里的解释器模式.迭代器模式.中介者模式. 一.解释器模式Interpret 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言的中的句子. 1 ...
- vue <input type="file">上传图片、预览、删除
使用原生<input type="file">上传图片.预览.删除:multiple实现可上传多张 参数名 类型 说明 fileTypes Array 文件类型, 默认 ...
- Python中的文本(一)
本文主要记录和总结本人在阅读<Python标准库>一书,文本这一章节的学习和理解. 事实上在Python中,使用文本这种一些方法是特别经常使用的一件事.在一般的情况下,都会使用String ...
- Valgrind的用法
Valgrind是执行在Linux上一套基于仿真技术的程序调试和分析工具,它包括一个内核──一个软件合成的CPU,和一系列的小工具,每一个工具都能够完毕一项任务──调试.分析,或測试等. Valgri ...