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];elsesave[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. UVALive - 3510 Pixel Shuffle (群论)

    题意:对一张像素图可以执行旋转.翻转.div.mix等操作,现在给出一个操作序列,问重复进行多少次这个操作序列,可以使得任意n*n的像素图变回原样. 转换一下就是:设操作序列为置换A,则求m使得A^m ...

  2. POJ-3590 The shuffle Problem 置换+DP | DFS

    题目链接:http://poj.org/problem?id=3590 自己暴力给水过去了,不过效率有点低.题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大.题目数据量不大, ...

  3. uva 716 - Commedia dell' arte(置换)

    题目链接:uva 716 - Commedia dell' arte 题目大意:给定一个三维的八数码,0表示空的位置,问说是否可以排回有序序列. 解题思路:对于n为奇数的情况,考虑三维八数码对应以为状 ...

  4. uva 10710——Chinese Shuffle

    题目大意:给定一个数n,然后洗牌n-1次问是否能回到初始状态,能回到则是jimmy-number,否则不是,具体怎么洗的,题中的图已经能够说明的很清楚,在此不再赘述! 思路:开始设了这个数为偶数,发现 ...

  5. UVA - 133 ​​​​​​​The Dole Queue

    The Dole Queue UVA - 133 题目传送门 模拟一遍过程,注:可能会选中同一个人 AC代码: #include <cstdio> #include <iostrea ...

  6. 【ICPC-369】uva 12096 The SetStack Computer

    点击打开链接uva 12096 思路: STL模拟 分析: 1 题目给定5种操作,每次输出栈顶集合的元素的个数 2 利用stack和set来模拟,set保存集合的元素.遇到push的时候直接在stac ...

  7. 置换 置换群 应用 +置换群对某些算法问题的解释

    置换 置换群 应用 http://hi.baidu.com/foreverlin1204/item/5bafa5e7e95629acc10d758b http://blog.163.com/myq_9 ...

  8. 《算法入门经典大赛——培训指南》第二章考试

    UVa特别考试 UVa站点专门为本书设立的分类题库配合,方便读者提交: http://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...

  9. 【今日CV 计算机视觉论文速览 第97期】Tue, 9 Apr 2019

    今日CS.CV 计算机视觉论文速览 Tue, 9 Apr 2019 (showing first 100 of 124 entries) Totally 100 papers ?上期速览 ✈更多精彩请 ...

最新文章

  1. Scala 位运算及代码块
  2. spark中使用categoricalFeaturesInfo来标记分类型变量
  3. c++ 数组的输入遇到特定字符停止输入_C语言 第4章-字符串和格式化输入/输出
  4. 如何利用小熊派获取MPU6050六轴原始数据
  5. 对于python命令行,你应该这么做才专业
  6. 从memcpy到memmove,内存函数拷贝与内存重叠问题(重点内容)
  7. Go语言之进阶篇响应报文测试方法
  8. 杀死所有tomcat进程
  9. 算法题003 斐波那契(Fibonacci)数列
  10. Leetcode 256.粉刷房子
  11. Silverlight中无法设置卫星程序集为中立资源程序集
  12. STM32串口通信简介
  13. java 二叉树详解 + 实现代码
  14. wordpress好用的插件-wordpress插件自动采集伪原创发布插件免费
  15. 为啥一到秋季就鼻塞、流鼻涕、打喷嚏?该如何是好?别总当成感冒
  16. 下一代微服务架构——Service Mesh 服务网格新生代Istio
  17. 成都蚂蚁金服java_成都蚂蚁金服暑期实习Java后台开发面经(已收到OC)
  18. .NET的.snk文件使用方法
  19. 【Selenium IDE】下载安装Chrome和Firefox插件IDE
  20. 006. 分割回文串

热门文章

  1. 受限玻尔兹曼机准备知识——蒙特卡洛方法
  2. HP Z840 工作站配sSAS Raid 安装 Ubuntu 16.04 系统
  3. Apache ServiceComb
  4. HttpWebRequest post上传文件
  5. [置顶] 程序员编程生产力相差10倍意味着什么?
  6. jquery.lazyload.js详解
  7. 让数字保持在整数范围内
  8. Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名...
  9. springboot ajax返回html
  10. div设置overflow-scroll滚动之后,jq获取其子元素的offset.top出现问题。