USACO Prime Cryptarithm 牛式

题目描述

农夫约翰的奶牛不停地从他的农场中逃出来,导致了很多损害。为了防止它们再逃出来,他买了一只很大的号码锁以防止奶牛们打开牧场的门。

农夫约翰知道他的奶牛很聪明,所以他希望确保它们不会在简单地试了很多不同的号码组合之后就能轻易开锁。锁上有三个转盘,每个上面有数字1…N (1 <= N <= 100),因为转盘是圆的,所以1和N是相邻的。有两种能开锁的号码组合,一种是农夫约翰设定的,还有一种“预设”号码组合是锁匠设定的。但是,锁有一定的容错性,所以,在每个转盘上的数字都与一个合法的号码组合中相应的数字相距两个位置以内时,锁也会打开。

比如说,如果农夫约翰的号码组合是(1,2,3),预设号码组合是(4,5,6),在转盘被设定为(1,4,5)(因为这和农夫约翰的号码组合足够接近)或(2,4,8)(因为这和预设号码组合足够接近)。注意,(1,5,6)并不会打开锁,因为它与任一号码组合都不够接近。

给出农夫约翰的号码组合和预设号码组合,请计算能够开锁的不同的号码组合的数目。号码是有序的,所以(1,2,3)与(3,2,1)不同。

输入格式:

第一行:整数N。

第二行:三个以空格分隔的整数,为农夫约翰的号码组合。

第三行:三个以空格分隔的整数,为预设号码组合(可能与农夫约翰的号码组合相同)。

输出格式:

第一行:所有不同的能够开锁的号码组合的总数。

输入样例1:

50
1 2 3
5 6 7

输出样例1:

249

解题思路

一看这道题,数据范围很小,就直接暴力,七重循环过了。

无论如何这道题还是很烦的,一次AC的人不说,错了之后就很难查错,看着那么多循环也感觉很奇怪。

代码

#include <iostream> 
#include <cstdio>
#include <algorithm>
using namespace std;
int cnt=0;
int v[6];
void crash(int n){
	int i=0;
	cnt=0;
	while(n!=0){
		v[i]=n%10;
		n/=10;
		i++;
		cnt++;
	}

}
int main(){
//	freopen("crypt1.in","r",stdin);
//	freopen("crypt1.out","w",stdout);
	int n;
	cin>>n;
	int a[10];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	int c=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<n;k++){
				for(int l=0;l<n;l++){
					for(int m=0;m<n;m++){
						int sum1=(a[i]*100+a[j]*10+a[k])*a[l];
						int sum2=(a[i]*100+a[j]*10+a[k])*a[m];
						int sum3=(a[i]*100+a[j]*10+a[k])*(10*a[l]+a[m]);
						crash(sum1);
						bool hello[4];
						for(int y=0;y<4;y++){
							hello[y]=false;
						}
						for(int z=0;z<cnt;z++){
							for(int y=0;y<n;y++){
								if(v[z]==a[y]){
									hello[z]=true;
									break;
								}
							}
						}
						int yn=true;
						for(int z=0;z<cnt;z++){
							if(hello[z]==false){
								yn=false;
							}
						}

						int tmp1=cnt; 
						
						
						
						
						crash(sum2);
						bool hello1[4];
						for(int y=0;y<4;y++){
							hello1[y]=false;
						}
						for(int z=0;z<cnt;z++){
						for(int y=0;y<n;y++){
							
								if(v[z]==a[y]){
									hello1[z]=true;
									break;
								}
							}
						}
						int yn1=true;
						for(int z=0;z<cnt;z++){
							if(hello1[z]==false){
								yn1=false;
							}
						}
						int tmp2=cnt;
						crash(sum3);
						bool hello2[6];
						for(int y=0;y<4;y++){
							hello2[y]=false;
						}
						for(int z=0;z<cnt;z++){
						for(int y=0;y<n;y++){
							
								if(v[z]==a[y]){
									hello2[z]=true;
									break;
								}
							}
						}
						int yn2=true;
						for(int z=0;z<cnt;z++){
							if(hello2[z]==false){
								yn2=false;
							}
						}
						int tmp3=cnt;
//							cout<<a[i]<<a[j]<<a[k]<<endl<<a[l]<<a[m]<<endl<<"sum1:"<<sum1<<" "<<"sum2:"<<sum2<<" "<<"sum3:"<<sum3<<endl;
						if(yn==true&&yn1==true&&yn2==true&&tmp1==3&&tmp2==3&&tmp3==4){
							c++;
//							cout<<a[i]<<a[j]<<a[k]<<endl<<a[l]<<a[m]<<endl<<"sum1:"<<sum1<<" "<<"sum2:"<<sum2<<" "<<"sum3:"<<sum3<<endl;
						}
//						cout<<"wrong place:"<<endl;
//						if(yn==false){
//							cout<<"1"<<endl;
//						} 
//						if(yn1==false){
//							cout<<"2"<<endl;
//						}
//						if(yn2==false){
//							cout<<"3"<<endl;
//						}
//						cout<<endl;
					}
				}
			}
		}
	}
	cout<<c<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/johnwayne0317/article/details/85037319