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的更多相关文章

  1. 【POJ2893&HDOJ6620】M × N Puzzle(n*m数码判定)

    题意:给定一个n*m的矩阵,其中不重复地填[0,n*m-1],问是否能通过有限步数将0移到右下角 n,m<=1e3 思路:结论题 当板子了 #include<bits/stdc++.h&g ...

  2. poj2893 M*N puzzle 【n*m数码问题小结】By cellur925

    题目传送门 这个问题是来源于lydrainbowcat老师书上讲排序的一个扩展.当时讲的是奇数码问题,其实这种问题有两种问法:一种局面能否到另一种局面.到达目标局面的最小步数. 本文部分内容引用于ly ...

  3. POJ 2893 M × N Puzzle(树状数组求逆序对)

                                                               M × N Puzzle Time Limit: 4000MS   Memory ...

  4. hdu 5465 Clarke and puzzle 二维线段树

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  5. M × N Puzzle POJ - 2893(奇数码)

    The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial inte ...

  6. HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle  Accepts: 42  Submissions: 26 ...

  7. POJ 2983 M × N Puzzle

    M × N Puzzle Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 4860   Accepted: 1321 Des ...

  8. 【LeetCode】773. Sliding Puzzle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/sliding- ...

  9. Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net

    Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...

随机推荐

  1. java随笔1 Ctrl+1补全

    Ctrl+1补全变量时,如果补全后的不是自己想要的, 比如:补全后这样 修改后 这时要对更改变量进行Ctrl+1补全路径 并且后者要进行Ctrl+1强转

  2. macOS & USB stick

    macOS & USB stick why macOS can only read USB stick, can not write files to USB stick macos 无法写文 ...

  3. 学习android开发之路(一)页面布局

    Android页面布局 1.Android页面布局一共分为6种: LinearLayout(线性布局).RelativeLayout(相对布局).TableLayout(表格布局).FrameLayo ...

  4. 1.docker 数据卷的备份和恢复(非大数据量)

    在生产环境中使用 Docker,很多时候需要对数据进行持久化,或者进行容器间的数据共享. 容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境: ...

  5. Nginx 慢启动与拥塞窗口

    L:127

  6. python代码块,小数据池,驻留机制深入剖析

    一,什么是代码块. 根据官网提示我们可以获知: 根据提示我们从官方文档找到了这样的说法: A Python program is constructed from code blocks. A blo ...

  7. ES系列十五、ES常用Java Client API

    一.简介 1.先看ES的架构图 二.ES支持的客户端连接方式 1.REST API http请求,例如,浏览器请求get方法:利用Postman等工具发起REST请求:java 发起httpClien ...

  8. Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

    在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...

  9. 解决Docker容器中不能用vim编辑文件

    更新来源: apt-get update 安装vim apt-get install -y vim 参考链接:https://blog.csdn.net/wangxinxinsj/article/de ...

  10. .net Json 反序列化时,属性带点

    .net Json 反序列化时,属性带点 使用[JsonProperty("xxx.xxx")] static void Main(string[] args) { string ...