绝境求生(八数码有解无解的问题,求逆序)
问题 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;
}
/**/
绝境求生(八数码有解无解的问题,求逆序)相关推荐
- 八数码问题-8puzzle
完整代码及测试数据 完整代码及测试数据 问题简介 八数码:是指在3x3的矩阵中,其中有8个格子放置成1-8,剩下一个格子是空格.能够移动和空格相邻的格子到空格,直到这个矩阵满足每一行依次从左到右读取是 ...
- 深度优先搜索求解八数码问题
上一篇 介绍了八数码问题的宽度优先搜索求解法.这里来看看深度优先搜索怎么完成. 深度优先的策略: 一种一直向下的搜索策略,初始节点开始,按生成规则生成下一级各子节点,检查是否出现目标节点.若未出现,则 ...
- HDUOJ1043Eight 八数码问题可以构造解
POJ朴素搜索能过的Eight,到HDU的变态数据就过不去了,然而无论双广还是A*都无法实现statistic里0ms的神迹.Discuss里看到了罗教主的一个回帖--构造解!于是专门向罗教主请教了一 ...
- C++解题报告:详解经典搜索难题——八数码问题( 双向BFS A* 求解)
引言 AC这道八数码问题,你和楼教主就是兄弟了... 题目描述 在一个3*3的九宫格棋盘里,放有8个数码,数码的数字分别是1~8.棋盘中还有一个位置是空着的,用0表示.可以通过在九宫格里平移数码来改变 ...
- [python 那些事儿] 八数码问题(深度搜索、宽度搜索、输出最优解、提前判断无解状态!A算法!)
导引 理论 宽度优先搜索算法 (python代码) 宽度优先--未输出最优解方法 宽度优先--输出最优解方法 深度优先算法(python代码) 深度优先--未输出最优解方法 深度优先--输出最优解方法 ...
- Poj 1077 eight(BFS+全序列Hash解八数码问题)
一.题意 经典的八数码问题,有人说不做此题人生不完整,哈哈.给出一个含数字1~8和字母x的3 * 3矩阵,如: 1 2 X 3 4 6 7 5 8 ...
- 一题多解-八数码(万字长文)
16 张炜皓 (ζ͡顾念̶°) LV 5 @ 1 周前 在做这道题前,先来认识一下deque双端队列 C++ STL 中的双端队列 题目连接 使用前需要先引入 头文件. #include; STL 中 ...
- AI 八数码A_star算法问题-实验报告
一 题目要求: 八数码问题的A星搜索算法实现 要求:设计估价函数,并采用c或python编程实现,以八数码为例演示A星算法的搜索过程,争取做到直观.清晰地演示算法,代码要适当加注释. ...
- 八数码问题及A*算法
一.八数码问题 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是: ...
最新文章
- 为什么获取crm服务器信息失败,为 Outlook 配置 Microsoft Dynamics CRM 客户端时出现 与 Microsoft Dynamics CRM 服务器通信时出现问题 错误...
- 年轻,误把unix当linux
- C++ Primer 5th笔记(6)chapter6 函数: 调试帮助
- Python日志详解【两篇就够了系列】--第一篇logging
- shell脚本小技巧
- TF从文件中读取数据
- java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列
- ASP.NET中的两个Cookie类:HttpCookie类与Cookie类
- HP 360G5 IO性能提高方法
- python信道仿真_Hanlp在Python环境中安装及使用.md
- 「三分钟系列06」3分钟看懂http与https的区别
- unixlinux命令,20个 Unix/Linux 命令技巧
- Matlab|模拟电动汽车的充放电【充电顺序,波动发电,电池缓冲】
- java 汉字转拼音_java汉字转拼音
- 当大数据遇到保险:传统精算模型将被颠覆
- 网页 php,怎么用php写一个网页
- iRedmail配置手册
- 互联网快讯:极米Z6X Pro、极米H3S获用户青睐;民德电子功率半导体赛道获进展
- spoolsv.exe占用cpu 100%的解决方法
- python3计算行列式的值(运用拉普拉斯展开法递归实现)
热门文章
- TINA-TI仿真报错Format ‘%s‘ invalid or incompatible with argument
- 阿里云网盘内测_申请阿里云网盘内测资格
- 守正创新,核心业务系统助推财务公司数字化转型
- android 手机网络接入点名称及WAP、NET模式的区别
- Linux部署ZABBIX-3.4.2
- 这个「微信年度报告」你被骗了吗?
- echarts 饼状图制作 legend 在右边且带有自定义参数,title在图标中间!
- 关于调查大学生日常零用钱使用情况
- 171. Excel表列序号(简单题)
- 排名前1%的学生,是靠天赋还是努力?其实都不是……