牛客上海高校程序设计竞赛 H CSL 的拼图(思维)

链接: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值