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主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...
随机推荐
- laravel添加model文件夹,需要改动的地方
首先,将app\User(等model文件),移入APP\modellists文件夹中,方便整理 第二,修改模型中命名空间和引用其他model的路径 第三,将文件夹app\admin中的控制器文件,全 ...
- npm install、npm install --save与npm install --save-dev区别
npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...
- node 模块化思想中index.js的重要性
目录结构如上图 module1和modlue2.main在同一级 module1下文件: index.js var test2=require('./test2'); var sayHi=functi ...
- Python基础知识1-基础语法
pyenv--版本管理工具(后续再补)可参见https://www.jianshu.com/p/8aaf2525fa80 冯诺依曼体系架构 编程基础 语言分类 低级语言到高级语言 高级语言 程序Pr ...
- GIT的前世今生
在重点介绍GIT的一些操作之前,我们首先来说一说GIT的前世今生,了解整个版本控制的变迁能够让我们知道该如何去选择这些工具,另外通过这些技术的变迁也能够让我们对现在的技术有着更加深入的理解,在正式介绍 ...
- Java多线程0:核心理论
并发编程是Java程序员最重要的技能之一,也是最难掌握的一种技能.它要求编程者对计算机最底层的运作原理有深刻的理解,同时要求编程者逻辑清晰.思维缜密,这样才能写出高效.安全.可靠的多线程并发程序.本系 ...
- Python包的相对导入时出现问题解决
资料参考: https://www.cnblogs.com/ArsenalfanInECNU/p/5346751.html 在python导入包,如下: from .units import * 经常 ...
- commons-lang
今天在编码的过程中,对于null,采用==null进行判断.并且为了过滤"",使用了str.trim().length()==0,当str为null时,报空指针异常. 于是决定使用 ...
- json-lib和dom4j实现JSON转XML
package com.geostar.gfstack.operationcenter.test; import net.sf.json.JSONObject; import net.sf.json. ...
- IntelliJ IDEA 取消【import .;】星号导包
Setting -- Editor -- Code Style -- Java -- Imports 在 在 具体数值自行填写,够大即可,截图如下: