60分--求助
查看原帖
60分--求助
1036945
Roy_2010楼主2023/10/22 14:27

一个暴力枚举,测试数据都过了,也没有超时,但就是错了#4#5#9#10(WA)。 (尽力了)


#include<bits/stdc++.h>
using namespace std;

int n,cnt=0,ccnt;
int a[10][10];
vector<int> v[2][6][10];
//第一维:修改一个还是两个数
//第二维:从第几个开始修改
//第三维:修改(加上)的值 

bool check(vector<int> &v1){
	for(int i=2;i<=n;++i){//每组测试 
		ccnt=0;//不一样次数 
		for(int j=1;j<7;++j){//按位判断 
			if(v1[j-1]!=a[i][j]){
				++ccnt;
				if(j<6&&v1[j-1]-a[i][j]==v1[j]-a[i][j+1])//拨动两个 
					++j;
			}
		}
		if(ccnt!=1)return false;//不能和原来一样,也不能太不一样 
	}
	return true;//筛选出来 
}

int main(){
	cin>>n;
	for(int i=1;i<=n;++i)
		for(int j=1;j<6;++j)
			cin>>a[i][j];//输入 
	for(int i=0;i<2;++i) 
		for(int j=0;j<6-i-1;++j)
			for(int k=1;k<10;++k)
				for(int m=1;m<7;++m)
					(m>=j+1&&m<=j+i+1)?v[i][j][k].push_back((a[1][m]+k)%10):v[i][j][k].push_back(a[1][m]);
	//以第一种情况扩展,在判断是否合法 
	for(int i=0;i<2;++i)
		for(int j=0;j<6-i-1;++j)
			for(int k=1;k<10;++k)
				if(check(v[i][j][k]))
					++cnt;
	//以此判断 
	cout<<cnt<<endl;
	return 0;
} 

有没有大佬帮忙修改一下。

2023/10/22 14:27
加载中...