问题 E: 【排序】绝境求生

时间限制: 1 Sec  内存限制: 64 MB
提交: 19  解决: 12

题目描述

The Eight Puzzle, among other sliding-tile puzzles, is one of the famous problems in artificial intelligence. Along with chess, tic-tac-toe and backgammon, it has been used to study search algorithms.

The Eight Puzzle can be generalized into an M × N Puzzle where at least one of M and N is odd. The puzzle is constructed with MN − 1 sliding tiles with each a number from 1 to MN − 1 on it packed into a M by N frame with one tile missing. For example, with M = 4 and N = 3, a puzzle may look like:

Let's call missing tile 0. The only legal operation is to exchange 0 and the tile with which it shares an edge. The goal of the puzzle is to find a sequence of legal operations that makes it look like:

The following steps solve the puzzle given above.

Given an M × N puzzle, you are to determine whether it can be solved.

样例输入

复制样例数据

3 3
1 0 3
4 2 5
7 8 6
4 3
1 2 5
4 6 9
11 8 10
3 7 0
0 0

样例输出

YES
NO

结论:N*M矩阵中,若M为奇数->计算给出矩阵的逆序数和与初始状态的逆序数看奇偶性:奇偶相同则存在,反之不存在

若M为偶数->计算给出矩阵的逆序数为ans1,初始0所在行与给出的0所在行之间的行间距ans2,判断:

(ans1%2) ==(ans2%2),成立则存在,反之不存在

用树状数组维护

/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>typedef long long LL;
using namespace std;int n, m;
int cnt;
int c[1000005], a[1000005];
int ans;int lowbit(int x){return x & (-x);
}void add(int x){while(x <= cnt){c[x]++;x += lowbit(x);}
}int sum(int x){int su = 0;while(x){su += c[x];x -= lowbit(x);}return su;
}int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);while(scanf("%d %d", &n, &m) == 2){if(!n && !m) break;memset(c, 0, sizeof(c));int p, x, ans = 0;cnt = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){scanf("%d", &x);if(x == 0) p = n - i;else{a[cnt++] = x;}}}for (int i = cnt - 1; i >= 0; i--){ans += sum(a[i]);//cout << a[i] << " " <<sum(a[i]) << endl;add(a[i]);}if(m & 1){if(ans % 2 == 0){printf("YES\n");}else{printf("NO\n");}continue;}if(ans % 2 == p % 2){printf("YES\n");}else{printf("NO\n");}}return 0;
}
/**/

绝境求生(八数码有解无解的问题,求逆序)相关推荐

  1. 八数码问题-8puzzle

    完整代码及测试数据 完整代码及测试数据 问题简介 八数码:是指在3x3的矩阵中,其中有8个格子放置成1-8,剩下一个格子是空格.能够移动和空格相邻的格子到空格,直到这个矩阵满足每一行依次从左到右读取是 ...

  2. 深度优先搜索求解八数码问题

    上一篇 介绍了八数码问题的宽度优先搜索求解法.这里来看看深度优先搜索怎么完成. 深度优先的策略: 一种一直向下的搜索策略,初始节点开始,按生成规则生成下一级各子节点,检查是否出现目标节点.若未出现,则 ...

  3. HDUOJ1043Eight 八数码问题可以构造解

    POJ朴素搜索能过的Eight,到HDU的变态数据就过不去了,然而无论双广还是A*都无法实现statistic里0ms的神迹.Discuss里看到了罗教主的一个回帖--构造解!于是专门向罗教主请教了一 ...

  4. C++解题报告:详解经典搜索难题——八数码问题( 双向BFS A* 求解)

    引言 AC这道八数码问题,你和楼教主就是兄弟了... 题目描述 在一个3*3的九宫格棋盘里,放有8个数码,数码的数字分别是1~8.棋盘中还有一个位置是空着的,用0表示.可以通过在九宫格里平移数码来改变 ...

  5. [python 那些事儿] 八数码问题(深度搜索、宽度搜索、输出最优解、提前判断无解状态!A算法!)

    导引 理论 宽度优先搜索算法 (python代码) 宽度优先--未输出最优解方法 宽度优先--输出最优解方法 深度优先算法(python代码) 深度优先--未输出最优解方法 深度优先--输出最优解方法 ...

  6. Poj 1077 eight(BFS+全序列Hash解八数码问题)

    一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1  2  X            3 4  6            7  5  8 ...

  7. 一题多解-八数码(万字长文)

    16 张炜皓 (ζ͡顾念̶°) LV 5 @ 1 周前 在做这道题前,先来认识一下deque双端队列 C++ STL 中的双端队列 题目连接 使用前需要先引入 头文件. #include; STL 中 ...

  8. AI 八数码A_star算法问题-实验报告

    一 题目要求: 八数码问题的A星搜索算法实现         要求:设计估价函数,并采用c或python编程实现,以八数码为例演示A星算法的搜索过程,争取做到直观.清晰地演示算法,代码要适当加注释. ...

  9. 八数码问题及A*算法

    一.八数码问题 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是: ...

最新文章

  1. 为什么获取crm服务器信息失败,为 Outlook 配置 Microsoft Dynamics CRM 客户端时出现 与 Microsoft Dynamics CRM 服务器通信时出现问题 错误...
  2. 年轻,误把unix当linux
  3. C++ Primer 5th笔记(6)chapter6 函数: 调试帮助
  4. Python日志详解【两篇就够了系列】--第一篇logging
  5. shell脚本小技巧
  6. TF从文件中读取数据
  7. java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列
  8. ASP.NET中的两个Cookie类:HttpCookie类与Cookie类
  9. HP 360G5 IO性能提高方法
  10. python信道仿真_Hanlp在Python环境中安装及使用.md
  11. 「三分钟系列06」3分钟看懂http与https的区别
  12. unixlinux命令,20个 Unix/Linux 命令技巧
  13. Matlab|模拟电动汽车的充放电【充电顺序,波动发电,电池缓冲】
  14. java 汉字转拼音_java汉字转拼音
  15. 当大数据遇到保险:传统精算模型将被颠覆
  16. 网页 php,怎么用php写一个网页
  17. iRedmail配置手册
  18. 互联网快讯:极米Z6X Pro、极米H3S获用户青睐;民德电子功率半导体赛道获进展
  19. spoolsv.exe占用cpu 100%的解决方法
  20. python3计算行列式的值(运用拉普拉斯展开法递归实现)

热门文章

  1. TINA-TI仿真报错Format ‘%s‘ invalid or incompatible with argument
  2. 阿里云网盘内测_申请阿里云网盘内测资格
  3. 守正创新,核心业务系统助推财务公司数字化转型
  4. android 手机网络接入点名称及WAP、NET模式的区别
  5. Linux部署ZABBIX-3.4.2
  6. 这个「微信年度报告」你被骗了吗?
  7. echarts 饼状图制作 legend 在右边且带有自定义参数,title在图标中间!
  8. 关于调查大学生日常零用钱使用情况
  9. 171. Excel表列序号(简单题)
  10. 排名前1%的学生,是靠天赋还是努力?其实都不是……