链接:https://ac.nowcoder.com/acm/contest/551/H
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
(思路:和这套题的E题一个套路,多了一个哈希(也就是编号)处理。https://blog.csdn.net/birdmanqin/article/details/88954834
因为是拼图,所以,N个位置不会变,只需要将每一块拼图放到该放的位置,把每个位置编号,记下每块拼图应该在的位置,遍历交换拼图的位置即可。)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#include <cmath>
#include <string>
#define ll long long
using namespace std;
const int maxn=1e6+10;
int d[20];
int a[maxn],b[maxn];
map <ll,int> mp;
int main(void)
{
int n,N=1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&d[i]);
N*=d[i];
}
for(int i=1;i<=N;i++)
{
int tmp=0,x;
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
tmp=tmp*10+x;
}
a[i]=tmp;
mp[tmp]=i;
tmp=0;
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
tmp=tmp*10+x;
}
b[i]=tmp;
}
int t,cnt=0,pos;
scanf("%d",&t);
for(int i=1;i<=N;i++)
{
if(a[i]==b[i]) continue;
//交换图片后,要更新mp[a[i]]的值。
pos=mp[b[i]];
mp[a[i]]=pos;
swap(a[i],a[pos]);
cnt++;
}
//这里注意,如果少于t步,但是差偶数步,只需要把两块拼图换回去再换回来即可。
if(cnt<=t&&(t-cnt)%2==0)
printf("YES\n");
else
printf("NO\n");
return 0;
}