codeforces 863C 1-2-3

本文解析了 CodeForces 平台上的一个题目,通过寻找循环节的方法解决了一个涉及矩阵操作的问题,并给出了完整的 C++ 实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://codeforces.com/problemset/problem/863/C




根据题意找循环节,然后求和。



#include<iostream>
#include<map>
using namespace std;
long long int an1=0,an2=0;
void did(long long int x,long long int y)
{
	if(x==1)
	{
		if(y==2)an2++;
		if(y==3)an1++;
	}
	else if(x==2)
	{
		if(y==3)an2++;
		if(y==1)an1++;
	}
	else if(x==3)
	{
		if(y==1)an2++;
		if(y==2)an1++;
	}
}
int main(){
	long long int k;
	long long int a,b;
	long long int a1[4][4],b1[4][4];
	while(cin>>k>>a>>b)
	{
		long long int i,j;
		for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
		cin>>a1[i][j];
		for(i=1;i<=3;i++)
		for(j=1;j<=3;j++)
		cin>>b1[i][j];
		map<long long int,long long int> xh;
		an1=0;an2=0;
		k--;
		did(a,b);
		long long int za,zb;
		long long int fa,fb; 
		xh[a*10+b]=1;
		long long int xhj;
		long long int js=k+1;
		while(k--)
		{
			za=a1[a][b];
			zb=b1[a][b];
			if(xh[za*10+zb]==0)
			{
				xh[za*10+zb]=xh[a*10+b]+1;
				did(za,zb);
				a=za;b=zb;
			}
			else {
				fa=za;fb=zb;
				xhj=xh[a*10+b]+1-xh[za*10+zb];
				break;
			}
		}
		if(k>=1)
		{
			k++;
			long long int cs=k/xhj;
			long long int sxd=k%xhj;
			long long int sa=0,sb=0;
			long long int aaa=fa,bbb=fb;
			if(fa==1)
	    {
		if(fb==2)sb++;
		if(fb==3)sa++;
     	}
     	else if(fa==2)
	    {
		if(fb==3)sb++;
		if(fb==1)sa++;
	    }
	     else if(fa==3)
	    {
		if(fb==1)sb++;
		if(fb==2)sa++;
	    }
			for(i=1;i<=xhj-1;i++)
			{
			    aaa=a1[fa][fb];
			    bbb=b1[fa][fb];
					if(aaa==1)
	    {
		if(bbb==2)sb++;
		if(bbb==3)sa++;
     	}
     			   else 	if(aaa==2)
	    {
		if(bbb==3)sb++;
		if(bbb==1)sa++;
     	}
     			else 	if(aaa==3)
	    {
		if(bbb==1)sb++;
		if(bbb==2)sa++;
     	}
     	fa=aaa;
     	fb=bbb;
			}
			an1+=cs*sa;an2+=cs*sb;
			for(i=1;i<=sxd;i++)
			{
				aaa=a1[fa][fb];
				bbb=b1[fa][fb];
				did(aaa,bbb);
			    fa=aaa;
			    fb=bbb;
			}
			cout<<an1<<" "<<an2<<endl;
		}
		else if(k==0&&xhj==1){
			did(fa,fb);
			cout<<an1<<" "<<an2<<endl; 
		}
		else {
			cout<<an1<<" "<<an2<<endl;
		}
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值