hdu 6620 Just an Old Puzzle(N数码问题)
2024-08-23 08:36:22
http://acm.hdu.edu.cn/showproblem.php?pid=6620
N数码问题:
n*n矩阵,里面填着1—n*n-1,还有1个空格,
通过上下左右移动空格的位置,
使矩阵里的数升序排列,空格在右下角。
解的存在性判断结论:
(上面的N=n*n-1)
将原矩阵从左上角开始展开成一个序列,计算该序列的逆序对数A
将目标矩阵同理计算逆序对数B
逆序对数的计算不包括空格
若n为奇数,A与B奇偶性相同则有解
若n为偶数,设原矩阵空格在第a行,目标矩阵空格在第b行,k=|a-b|
若k为奇数,A与B奇偶性不同则有解
若k为偶数,A与B奇偶性相同则有解
简要理解:
空格左右移动,逆序对数的奇偶性不变
空格上下移动,
若n为偶数,空格与上/下的数m 之间相隔n-1个数,这n-1个数中,若有c个比m小,则有n-1-c个比m大
逆序数改变 |(n-1-c)- c |,即逆序对数改变奇数对
若n为奇数,同理,逆序对数改变偶数对
本题代码:
#include<cstdio> using namespace std; int a[]; int main()
{
int T;
scanf("%d",&T);
int c,d,sum;
d=;
while(T--)
{
for(int i=;i<=;++i)
{
scanf("%d",&a[i]);
if(!a[i]) c=(i-)/+;
}
sum=;
for(int i=;i<=;++i)
if(a[i])
for(int j=i+;j<=;++j)
if(a[j])
if(a[i]>a[j]) sum++;
if(!(((d-c)^sum)&)) printf("Yes\n");
else printf("No\n");
}
}
最新文章
- django 强制登录最佳实践
- MyBatis - MyBatis使用log4j2显示sql和结果集
- ubuntu16.04安装jdk,tomcat
- 在不知下面有几个元素的时候,要去除最后一个元素的下边框jquery代码
- for语句
- easyrtc-server在ubuntu14.04上的安装方法
- ios 给uiview创作遮罩
- 关于Git补丁文件交互
- php中的双引号和单引号的区别?
- 【Android N_启示录】
- fiddler 抓取手机app请求包
- A1146. Topological Order
- js数组歌
- InvocationHandler和Proxy(Class)的动态代理机制详解
- Centos7下的systemctl命令与service和chkconfig
- EasyUI值的清空与获取
- Excel 两列单元格合并超级链接的VBA 写法
- LeetCode题解之 Odd Even Linked List
- django 项目运行时static静态文件不能加载问题处理
- Flink架构分析之资源分配