分享一下S1的个人解法
  • 板块灌水区
  • 楼主AeeE5x
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/10/22 10:51
  • 上次更新2023/11/2 11:58:39
查看原帖
分享一下S1的个人解法
708516
AeeE5x楼主2023/10/22 10:51

没有思路 十分暴力
就是把第一个状态的81种情况全试一遍然后一个个排除()

#include<iostream>
#include<cstdio>
using namespace std;
bool cans(int a[],int b[]){
	int znum=0,zsk[5][2]={},l=0;
	for(int i=0;i<5;++i){
		if(a[i]-b[i]==0) znum++;
		else{
			zsk[l][0]=i;
			zsk[l][1]=(a[i]-b[i]<0?a[i]-b[i]+10:a[i]-b[i]);
			l++;
		}
	}
	if(znum==4) return true;
	else if(znum==5||znum<=2) return false;
	else return !(zsk[0][0]-zsk[1][0]!=-1||zsk[0][1]!=zsk[1][1]);
}
int main(){
//	freopen("lock.in","r",stdin);
//	freopen("lock.out","w",stdout);

	int n;
	scanf("%d",&n);
	int lis[n][5];
	for(int i=0;i<n;++i) for(int j=0;j<5;++j) scanf("%d",&lis[i][j]);
	
	if(n==1) printf("81");
	else{
		int map[81][6],l=0,sum=81;
		//只转一个拨圈 
		for(int s=1;s<=9;++s){
			for(int q=0;q<5;++q){
				for(int i=0;i<5;++i) if(i!=q) map[l][i]=lis[0][i];
				map[l][q]=(lis[0][q]+s)%10;
				map[l][5]=1;
				l++;
			}
		}
		//转相邻两个拨圈 
		for(int s=1;s<=9;++s){
			for(int q=0;q<4;++q){
				for(int i=0;i<5;++i) if(i!=q&&i!=q+1) map[l][i]=lis[0][i];
				map[l][q]=(lis[0][q]+s)%10;
				map[l][q+1]=(lis[0][q+1]+s)%10;
				map[l][5]=1;
				l++;
			}
		}
		for(int p=0;p<l;p++){
			for(int i=0;i<n;i++){
				if(!cans(lis[i],map[p])){
					sum--;
					break;
				}
			}
		}
		printf("%d",sum);
	}
	
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}	
2023/10/22 10:51
加载中...