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(模拟+置换)的更多相关文章

  1. uva 10710 - Chinese Shuffle(完美洗牌)

    option=com_onlinejudge&Itemid=8&category=474&page=show_problem&problem=1651"> ...

  2. LA 3510 (置换 循环分解) Pixel Shuffle

    思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用O(n2k)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A分解循环,m则等于所有循环节长 ...

  3. UVALive - 3510 Pixel Shuffle (置换)

    题目链接 有一个n*n的图像和7种置换,以及一个置换序列,求将这个序列重复做几次能得到原图像. 将这些置换序列乘起来可得到一个最终置换,这个置换所有循环节的长度的lcm即为答案. 注意置换是从右往左进 ...

  4. UVa 11210 - Chinese Mahjong 模拟, 枚举 难度: 0

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. UVA 12050 - Palindrome Numbers 模拟

    题目大意:给出i,输出第i个镜像数,不能有前导0. 题解:从外层开始模拟 #include <stdio.h> int p(int x) { int sum, i; ;i<=x;i+ ...

  6. Uva 679 Dropping Balls (模拟/二叉树的编号)

    题意:有一颗二叉树,深度为D,所有节点从上到下从左到右编号为1,2,3.....在结点一处放一个小球,每个节点是一个开关,初始全是关闭的,小球从顶点落下,小球每次经过开关就会把它的状态置反,现在问第k ...

  7. ●UVa 1589 Xiangqi(模拟)

    ●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...

  8. 【每日一题】 UVA - 213 Message Decoding 模拟解码+读入函数+阅读题

    题意:阅读理解难度一道比一道难orz.手摸了好久样例 题解: 读入:大循环用getline读入header顺便处理一下,  里面再写两重循环,外层一次读三个串,内层一次读num个串. 之后就查表,线性 ...

  9. LA3510 Pixel Shuffle

    题意 PDF 分析 思路挺简单的,题目中的每个命令(包括命令的逆)相当于一个置换. 用\(O(n^2k)\)的时间复杂度从右往左求出这些置换的乘积A,然后求m使Am = I(I为全等置换) 还是先把A ...

随机推荐

  1. offSet和client和scroll

    这三个是是js盒模型属性 client clientWidth 内容宽度加上左右padding clientHeight 内容高度加上上下padding clientTop 上边框的宽度 client ...

  2. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  3. Centos6.4安装opennebula

    Centos6.4安装opennebula #安装163源 http://mirrors.163.com/.help/CentOS6-Base-163.repo #安装epel源 wget http: ...

  4. 32.Node.js中的常用工具类util

    转自:http://www.runoob.com/nodejs/nodejs-module-system.html util是一个Node.js核心模块,提供常用函数的集合,用于弥补JavaScrip ...

  5. 17.Node.js 回调函数--异步编程

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程 ...

  6. Flume的Collector

    Collector的作用是将多个Agent的数据汇总后,加载到Storage中.它的source和sink与agent类似. 数据源(source),如: collectorSource[(port) ...

  7. arm-linux-gcc 命令未找到问题

    解决方法: 1.先打开一个超级用户权限的shell: 命令: ubuntu :sudo –s centos :su - 2.在当前shell下,设置环境变量: 命令:gedit /etc/profil ...

  8. Input File选择图片后,未保存预览

    今天实现上传图片到服务器 简单的jQuery实现input file选择图片后,可以预览图片的效果 简单的HTML代码: <div> <img src="" cl ...

  9. BZOJ3672: [Noi2014]购票(CDQ分治,点分治)

    Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树 ...

  10. BZOJ2733: [HNOI2012]永无乡(线段树合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...