USACO Prime Cryptarithm 牛式
阿新 • • 發佈:2019-01-05
題目描述
農夫約翰的奶牛不停地從他的農場中逃出來,導致了很多損害。為了防止它們再逃出來,他買了一隻很大的號碼鎖以防止奶牛們開啟牧場的門。
農夫約翰知道他的奶牛很聰明,所以他希望確保它們不會在簡單地試了很多不同的號碼組合之後就能輕易開鎖。鎖上有三個轉盤,每個上面有數字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;
}