华师一附中OI组
标题:
数字游戏中的判断重复问题
[打印本页]
作者:
diggersun
时间:
2014-11-22 14:24
标题:
数字游戏中的判断重复问题
本帖最后由 diggersun 于 2014-11-22 14:40 编辑
数学中常见这样的智力题:
ONE+ONE=TWO
AHHAAH/JOKE=HA
等等,其中每个字母表示一个数字,不同的字母呢,他还表示不同的数字,请问,分别是多少呢?
作者:
diggersun
时间:
2014-11-22 14:39
本帖最后由 diggersun 于 2015-10-31 23:48 编辑
标准的做法是用a(0)-a(9)来记录每个数字出现的次数,若设初值为1,每出现一起次数减1,那么查找十个数字中谁小于0就说明谁出现了不止一次。
枚举时候也充分考虑到了数字的特殊性,比如hahaah的枚举生成。
for (i=0; i<=9; i++) aa[i]=1;
假设每个数字只能出现1次
aa[h]--;aa[a]--;aa[j]--;aa[o]--;aa[k]--; aa[e]--;
b=true; i=0; 类似判断质数时的初值设置
while (b && i<=9)
{
if (aa[i]<0) b=false ;
else i++;
}
b=false出现了重复 完全类似经典的质数判断
复制代码
# include <iostream>
int aa[10]; //表示这个数字被用了多少次,注意0..9共有10个数字,10个可能!!!!
int a,h,ha,ahhaah,joke,j,o,k,e;
bool b;
int i;
using namespace std;
int main()
{
for (ha=10; ha<=99; ha++)
for (joke=1000; joke<=9999; joke++)
{
ahhaah=joke*ha;
h=ha/10; a=ha%10;
j=joke/1000; o=joke/100%10; k=joke/10%10; e=joke%10;
if (ahhaah==11001*h+100110*a)
{
b=true; for (i=0; i<=9; i++) aa[i]=1;
aa[h]--; aa[a]--;
aa[j]--; aa[o]--; aa[k]--; aa[e]--;
i=0; while (b && i<=9)
{
if (aa[i]<0) b=false ;
else i++;
}
if (b) cout <<ahhaah<<'/'<<joke<<'='<<ha<<endl;
}
}
}
复制代码
作者:
diggersun
时间:
2014-11-22 15:12
例题2 将1到9 九个数字围成一个边长为4 的正三角形,让每条边上的数字和都等于P,输入P,问有多少种摆法呢?
好理解 但是效率不高的解法
# include <iostream>
int a,b,c,d,e,f,g,h,i,p;//表示这9 个数字
int aa[10];//a[0]被浪费了;
bool bb;
int ii;
using namespace std;
int main()
{
cin>>p;
for (a=1;a<=9;a++)
for (b=1;b<=9;b++)
for (c=1;c<=9;c++)
for (d=1;d<=9;d++)
for (e=1;e<=9;e++)
for (f=1;f<=9;f++)
for (g=1;g<=9;g++)
for (h=1;h<=9;h++)
for (i=1;i<=9;i++)
if ((a+b+c+d==p) &&(d+e+f+g==p) &&(g+h+i+a==p) )
{
bb=true;
for (ii=1;ii<=9;ii++) aa[ii]=1;
aa[a]--;aa[b]--;aa[c]--;aa[d]--;aa[e]--;
aa[f]--;aa[g]--;aa[h]--;aa[i]--;
ii=1;while ((ii<=9) && bb) {if (aa[ii]<0) bb=false; else ii++;}
if (bb)
{ cout <<a<<'+'<<b<<'+'<<c<<'+'<<d<<'=';
cout <<d<<'+'<<e<<'+'<<f<<'+'<<g<<'=';
cout <<g<<'+'<<h<<'+'<<i<<'+'<<a<<endl;
}
}
}
复制代码
作者:
/wjr/
时间:
2014-11-22 21:48
例二的奇葩解法。。。
#include<iostream>
using namespace std;
int p,a[10],p0;
long long tot;
bool b[10],t;
void print()
{
for(int i=1;i<=9;i++)
{
if(!b[i]&&!t)a[8]=i,t=1;
else if(!b[i]&&t)a[9]=i;
}
cout<<tot++<<":"<<a[1]<<"+"<<a[2]<<"+"<<a[3]<<"+"<<a[4]<<"="<<a[4]<<"+"<<a[5]<<"+"<<a[6]<<"+"<<a[7]<<"="<<a[7]<<"+"<<a[8]<<"+"<<a[9]<<"+"<<a[1]<<endl;
cout<<tot++<<":"<<a[1]<<"+"<<a[2]<<"+"<<a[3]<<"+"<<a[4]<<"="<<a[4]<<"+"<<a[5]<<"+"<<a[6]<<"+"<<a[7]<<"="<<a[7]<<"+"<<a[9]<<"+"<<a[8]<<"+"<<a[1]<<endl;//没办法啊,只能输出这么长了
}
void search(int i)
{
for(int j=1;j<=9;j++)
if(!b[j]&&!b[p-a[i-1]-a[i+2]-j]&&p-a[i-1]-a[i+2]-j<=9&&p-a[i-1]-a[i+2]-j>=1&&p-a[i-1]-a[i+2]-j!=j)
{
a[i]=j;a[i+1]=p-a[i-1]-a[i+2]-j;
b[a[i]]=b[a[i+1]]=1;
if(i==5)print();
else search(i+3);
b[a[i]]=b[a[i+1]]=0;
}
}
int main()
{
cin>>p;
p0=p*3-45;
for(a[1]=1;a[1]<=9;a[1]++)
for(a[4]=1;a[4]<=9;a[4]++)
if(a[1]!=a[4]&&p0-a[1]-a[4]<=9&&p0-a[1]-a[4]>0&&p0-a[1]-a[4]!=a[1]&&p0-a[1]-a[4]!=a[4])
{a[7]=p0-a[1]-a[4];b[a[1]]=b[a[4]]=b[a[7]]=1;search(2);b[a[1]]=b[a[4]]=b[a[7]]=0;}
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2