poj2893 M×N puzzle
x数码难题有解性判定:
只有必要性证明,没有充分性......
还记得那个naive至极的八数码难题吗?
它回来了!
主要是借助逆序对这一神奇的手段:
考虑把x数码写成一排时的逆序对的奇偶性:
当你左右挪时显然没有影响。
当你上下挪时:列数为奇数则对逆序对奇偶性无影响,为偶数则变动。
然后我们就按照这个莫名其妙的法则A题......666
(注意:此法则不能容许有相同数字。否则奇偶性随机变化,无从下手)
- // poj 2893
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int N = ;
- const int N2 = N * N;
- int g[N][N];
- typedef long long LL;
- struct TreeArray {
- int a[N2];
- void clear() {
- memset(a, , sizeof(a));
- return;
- }
- int lowbit(int x) {
- return x & (-x);
- }
- void add(int x, int y) {
- if(x == ) {
- return;
- }
- for(int i = x; i < N2; i += lowbit(i)) {
- a[i] += y;
- }
- return;
- }
- int getsum(int x) {
- if(x == ) {
- return ;
- }
- int ans = ;
- for(int i = x; i > ; i -= lowbit(i)) {
- ans += a[i];
- }
- return ans;
- }
- int ask(int l, int r) {
- return getsum(r) - getsum(l - );
- }
- }ta;
- int main() {
- int a, b, xx, yy;
- scanf("%d%d", &a, &b);
- while(a || b) {
- ta.clear();
- for(int i = ; i <= a; i++) {
- for(int j = ; j <= b; j++) {
- scanf("%d", &g[i][j]);
- if(!g[i][j]) {
- xx = i;
- yy = j;
- }
- }
- }
- // 本题不用离散化
- LL ans = ;
- for(int i = a; i >= ; i--) {
- for(int j = b; j >= ; j--) {
- if(g[i][j]) {
- ans += ta.getsum(g[i][j] - );
- ta.add(g[i][j], );
- }
- }
- }
- if(!(b & )) {
- ans += (a - xx);
- }
- if(ans & ) {
- printf("NO\n");
- }
- else printf("YES\n");
- scanf("%d%d", &a, &b);
- }
- return ;
- }
AC代码
poj2893 M×N puzzle的更多相关文章
- 【POJ2893&HDOJ6620】M × N Puzzle(n*m数码判定)
题意:给定一个n*m的矩阵,其中不重复地填[0,n*m-1],问是否能通过有限步数将0移到右下角 n,m<=1e3 思路:结论题 当板子了 #include<bits/stdc++.h&g ...
- poj2893 M*N puzzle 【n*m数码问题小结】By cellur925
题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...
- POJ 2893 M × N Puzzle(树状数组求逆序对)
M × N Puzzle Time Limit: 4000MS Memory ...
- hdu 5465 Clarke and puzzle 二维线段树
Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- M × N Puzzle POJ - 2893(奇数码)
The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial inte ...
- HDU 5465 Clarke and puzzle Nim游戏+二维树状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 26 ...
- POJ 2983 M × N Puzzle
M × N Puzzle Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 4860 Accepted: 1321 Des ...
- 【LeetCode】773. Sliding Puzzle 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/sliding- ...
- Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net
Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
随机推荐
- 运行Spark-shell,解决Unable to load native-hadoop library for your platform
启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...
- Spring 基于XML配置
基于XML的配置 对于基于XML的配置,Spring 1.0的配置文件采用DTD格式,Spring2.0以后采用Schema格式,后者让不同类型的配罝拥有了自己的命名空间,使得配置文件更具扩展性.此外 ...
- 转《基于Ionic3实现微信支付和支付宝支付》
在Ionic应用里实现支付并不难,但是有的坑真是不爬不知道. 一:支付宝支付 网上关于支付宝支付cordova插件真是非常多,但是大多会报一些让你很无语的错误.比如sdk早已过时不是最新的,或者没有出 ...
- 腾讯机试题 AcWing 603 打怪兽
题目链接:https://www.acwing.com/problem/content/605/ 题目大意: 略 分析: 用dp[i][j]表示用j元钱能在前i只怪兽上所能贿赂到的最大武力值. 有一种 ...
- scala mkstring
如果你想要把集合元素转化为字符串,可能还会添加分隔符,前缀,后缀. Solution 使用mkString方法来打印一个集合内容,下面给一个简单的例子: scala> val a = Array ...
- Yii2的使用
yii2的下载安装 使用下载好的文件配置高级模板,在配置文件配置好数据库和gii 在common模板配置db: 在backend模板配置gii: 配置nginx服务器访问backend和fronten ...
- Java HashMap的put操作(Java1.8)
https://www.cnblogs.com/JzedyBlogs/p/10208295.html 写得非常好: 这个是Java1.8 ------------------------------- ...
- css繼承
概念:就是上級設置了css屬性,下級默認有同樣的樣式,如果下級需要不一樣的樣式,那麼就需要單獨對下級設置. 範圍: font-family:字體 font-weight:粗細 font-size:尺寸 ...
- 遍历map中的内容
Map<String, CartItem> cartItems = cart.getCartItems();for(Map.Entry<String, CartItem> en ...
- CentOS安装GIt、上传项目到git仓库
上传项目 登录服务器后安装git yum install git 新建文件夹(仓库) mkdir *.git 初始化仓库 git init --bare *.git 在本地初始化仓库 git init ...