题意:

给出一个 n∗mn*mn∗m 的方格,每次交换一行或一列,问是否可以将该行还原回去,如果可以就输出最少操作数。(aaa 为初始图形,1≤n,m≤3001\leq n,m\leq 3001≤n,m≤300)


思路:

稍加分析,可以得出几个结论。还原操作数可以行列分开算。如果可以还原,则每行错位位置相同。

因此问题就变成了现在有一个数列,数列上有几个位置发生了错位,最少需要几步可以还原这个数列。

我们可以从小例子开始考虑,如果一串数字中有 222 个位置错位,最少需要几步?如果是 333 个位置、444 个位置呢?

从上面的小例子分析中可以发现,错位关系,即 aaa 位置原本在 bbb 位置,a→ba\rightarrow ba→b 关系。每个位置都有一个错位关系,最后这个错位关系会形成一个环。

例如排列 3123 \ 1 \ 23 1 2,错位关系为 1→31\rightarrow 31→3、2→12\rightarrow 12→1、3→23\rightarrow 23→2 ,所有的错位关系最后形成了一个环,而还原这个环的步骤数为 n−1n-1n−1 ,nnn 为这个环中的数字总数。由此,此题解决。


总结:

此题的收获主要是对于错位关系的分析,毫无头绪时先从小例子开始考虑,不断发现总结其中的共性,从而得到结论。


代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 300+100;
const int M = 1e5+100;
const db EPS = 1e-9;
using namespace std;int n,m,mp[N][N],vis[N],book[N*N];int check(){//确定每一行的数为连续rep(i,1,n){rep(j,1,m) vis[j] = 0;int base = ((mp[i][1]-1)/m)*m;rep(j,1,m){int p = mp[i][j]-base;if(p > m || p < 1) return 0;vis[p] = 1;}rep(j,1,m)if(!vis[j]) return 0;}//确定各行对不上的位置一致int base = ((mp[1][1]-1)/m)*m;rep(j,1,m) vis[j] = mp[1][j]-base;rep(i,1,n){int base = ((mp[i][1]-1)/m)*m;rep(j,1,m){if(vis[j] != mp[i][j]-base) return 0;}}//确定各行组成的数为1-nrep(i,1,n) vis[i] = 0;rep(i,1,n){int base = ((mp[i][1]-1)/m)+1;if(base > n || base < 1) return 0;vis[base] = 1;}rep(i,1,n)if(!vis[i]) return 0;rep(i,1,n)rep(j,1,m) book[mp[i][j]] = 1;rep(i,1,n*m)if(book[i] != 1) return 0;return 1;
}   int main()
{scanf("%d%d",&n,&m);rep(i,1,n)rep(j,1,m) scanf("%d",&mp[i][j]);if(check()){int ans = 0;rep(i,1,n){vis[i] = ((mp[i][1]-1)/m)+1;}rep(i,1,n){if(vis[i] == i) continue;else{int tp = vis[i];while(tp != i){int xx = tp;tp = vis[tp]; ans++;vis[xx] = xx;}}}rep(j,1,m){vis[j] = mp[1][j]%m;if(vis[j] == 0) vis[j] = m;// LOG2("j",j,"vis[j]",vis[j]);}rep(i,1,m){if(vis[i] == i) continue;else{int tp = vis[i];while(tp != i){int xx = tp;tp = vis[tp]; ans++;vis[xx] = xx;}}}printf("%d\n",ans);}else printf("*\n");return 0;
}

【Gym — 101473 G】Lines of Containers【思维题】相关推荐

  1. ACM思维题训练 Section A

    题目地址: 选题为入门的Codeforce div2/div1的C题和D题. 题解: A:CF思维联系–CodeForces -214C (拓扑排序+思维+贪心) B:CF–思维练习-- CodeFo ...

  2. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)

    题干: Each New Year Timofey and his friends cut down a tree of n vertices and bring it home. After tha ...

  3. CSP难度的经典题目/有趣的思维题选讲(一)

    引言 这里讲到的难题是一部分非常典型的题目,但并不是所有.因此这并非是一个全面的知识列表,而只适合提高组同学用来提升能力和拓展视野. 这篇文章在很多地方讲述的不够详细和严谨,因为它的作用并非是题解,而 ...

  4. 字符串——BZOJ 3097: Hash Killer I【构造题,思维题】

    BZOJ 3097: Hash Killer I[构造题,思维题] 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3097 题意:让你出一组 ...

  5. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  6. little w and Soda(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  7. ZOJ 3829 贪心 思维题

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...

  8. yoyo思维题(困难) 组合数学

    问题 B: yoyo思维题(困难) 时间限制: 1 Sec  内存限制: 256 MB 提交: 11  解决: 3 [提交][状态][讨论版][命题人:qianyouyou][Edit] [TestD ...

  9. 1884: 三个家庭(思维题)

    1884: 三个家庭 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 244 Solved: 81 [Submit][Status][Web Board] ...

  10. 思维题 UVA 10881 Piotr's Ants

    题目传送门 1 /* 2 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 3 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 4 关键2:蚂蚁的相对位置 ...

最新文章

  1. CoCreateInstance 出错 ,返回 -2147221164 CLASS_NOT_REGISTERED ,原因
  2. 运维-系统架构师经验总结:
  3. centos查看当前目录文件夹的大小与tar解压到指定目录
  4. httpsrequest java_java如何通过https返回数据
  5. c#中实现图像图像卷积与滤波-高斯平滑
  6. MySQL5安装配置笔记【超详细】
  7. wordpress的下载和安装介绍
  8. java 启动xms_关于java:启动JVM时-Xms和-Xmx参数是什么?
  9. altium designer快捷键大全
  10. 图书管理系统(前台(vue))
  11. 自动驾驶中的多种卡尔曼滤波算法及推导详解,值得一读!
  12. 摄像头设计工程师面试技巧_系统设计面试准备的5个技巧
  13. 二元二次方程例题_二元二次方程练习题.doc
  14. 各纬度气候分布图_高中地理丨各种气候类型分布图+气候问题全总结,再也不怕搞混了!...
  15. 100 bugs in Open Source C/C++ projects
  16. JS 每日一题 #12
  17. 每个程序员都应该了解的 CPU 高速缓存
  18. MySQL学习之路(一):使用命令行登录mysql的方式
  19. ssm栾城五中的图书管理毕业设计源码171727
  20. 航海王启航服务器维修,新手疑难杂症解决航海王启航不走冤枉路

热门文章

  1. 垂直型与水平型电子商务网站的理解
  2. 连接 mysql 数据库失败频繁的原因探秘
  3. Lua概念定义及相关资料
  4. linux清理磁盘空间_Ubuntu上释放磁盘空间的几种简单方法
  5. VGG16(pytorch自带的) + CIFAR10
  6. 51cto shell mysql备份数据库_shell脚本备份MYSQL数据库
  7. python aiompq集群_python操作memcached以及分布式
  8. 计算机系统结构期末张晨曦,计算机系统结构(张晨曦)试题
  9. 汇编中NEG和NOT的区别(汇编初学者简单笔记)
  10. linus系统安装mysql_linux安装MYSQL