刷题链接: link.
16 ? ? 13
? ? 11 ?
9 ? ? *
? 15 ? 1
#include
using namespace std;
int a[10]={2,3,4,5,6,7,8,10,12,14};
void check()
{
int r1=16+a[0]+a[1]+13;
int r2=a[2]+a[3]+11+a[4];
int r3=9+a[5]+a[6]+a[7];
int r4=a[8]+15+a[9]+1;
int c1=16+a[2]+9+a[8];
int c2=a[0]+a[3]+a[5]+15;
int c3=a[1]+11+a[6]+a[9];
int c4=13+a[4]+a[7]+1;
int d1=16+a[3]+a[6]+1;
int d2=13+11+a[5]+a[8];
if(r1==r2&&r2==r3&&r3==r4&&r4==c1&&c1==c2&&c2==c3&&c3==c4&&c4==d1&&d1==d2)
cout<
刷题链接: link.
#include
#include
int main() {
int num[7];
int a[13] = {0,1,8,2,4,5,6,7,9,10,11,12,3};
do {
num[1] = a[1] + a[3] + a[6] + a[8];
num[2] = a[1] + a[4] + a[7] + a[11];
num[3] = a[2] + a[3] + a[4] + a[5];
num[4] = a[2] + a[6] + a[9] + a[12];
num[5] = a[5] + a[7] + a[10] + a[12];
num[6] = a[8] + a[9] + a[10] + a[11];
if(num[1]==num[2] && num[2]==num[3] && num[3]==num[4] && num[4]==num[5] && num[5]==num[6])
printf("%d\n", a[6]);
} while(std::next_permutation(a+3, a+12)); // a 数组中前三个(0,1,8)和最后一个(3)不参与排列
return 0;
}
刷题链接: link.
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
#include
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int count=0;
do
{
if((abs(a[0]-a[1])!=1)&&(abs(a[0]-a[3])!=1)&&(abs(a[0]-a[4])!=1)&&(abs(a[0]-a[5])!=1))
{
if((abs(a[1]-a[2])!=1)&&(abs(a[1]-a[4])!=1)&&(abs(a[1]-a[5])!=1)&&(abs(a[1]-a[6])!=1))
{
if((abs(a[2]-a[5])!=1)&&(abs(a[2]-a[6])!=1))
{
if((abs(a[3]-a[4])!=1)&&(abs(a[3]-a[7])!=1)&&(abs(a[3]-a[8])!=1))
{
if((abs(a[4]-a[5])!=1)&&(abs(a[4]-a[7])!=1)&&(abs(a[4]-a[8])!=1)&&(abs(a[4]-a[9])!=1))
{
if((abs(a[5]-a[6])!=1)&&(abs(a[5]-a[8])!=1)&&(abs(a[5]-a[9])!=1))
{
if((abs(a[6]-a[9])!=1))
{
if((abs(a[7]-a[8])!=1)&&(abs(a[8]-a[9])!=1))
{
count++;
/*printf(" %d %d %d\n",a[0],a[1],a[2]);
printf("%d %d %d %d\n",a[3],a[4],a[5],a[6]);
printf("%d %d %d\n",a[7],a[8],a[9]);
printf("************\n");*/
}
}
}
}
}
}
}
}
}while(next_permutation(a,a+10));
printf("%d",count);
return 0;
}
刷题链接: link.
4 9 2
3 5 7
8 1 6
输入格式:
输入仅包含单组测试数据。
每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。
对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。
输出格式:
如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。
样例输入
0 7 2
0 5 0
0 3 0
样例输出
6 7 2
1 5 9
8 3 4
#include
using namespace std;
int main()
{
//a为输入数组,temp为存储答案的数组,c为需要全排列数字的数组。
int a[10],temp[10],c[10];
bool b[10]={false};
int len=0,count=0;
for(int i=0;i<9;i++)
{
scanf("%d",&a[i]);
if(a[i]!=0)
b[a[i]]=true;
}
for(int i=1;i<10;i++)
if(b[i]==false)
c[len++]=i;
sort(c,c+len);
do
{
int L=0;
for(int i=0;i<9;i++)
if(b[a[i]]==0)
a[i]=c[L++];
int l1=a[0]+a[1]+a[2];
int l2=a[3]+a[4]+a[5];
int l3=a[6]+a[7]+a[8];
int l4=a[0]+a[3]+a[6];
int l5=a[1]+a[4]+a[7];
int l6=a[2]+a[5]+a[8];
int l7=a[0]+a[4]+a[8];
int l8=a[2]+a[4]+a[6];
if(l1==l2&&l2==l3&&l3==l4&&l4==l5&&l5==l6&&l6==l7&&l7==l8)
{
count++;
if(count>=2)
{
printf("Too Many");
return 0;
}
for(int i=0;i<9;i++)
temp[i]=a[i];
}
}while(next_permutation(c,c+len));
for(int i=0;i<9;i++)
{
if((i+1)%3==0)
printf("%d\n",temp[i]);
else
printf("%d ",temp[i]);
}
return 0;
}
刷题链接: link.
B DEF
A + --- + ------- = 10
C GHI
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
#include
using namespace std;
int main()
{
int count=0;
double a[10]={1,2,3,4,5,6,7,8,9};
do{
double s1=a[1]/a[2]*1.0;
double s2=a[3]*100+a[4]*10+a[5];
double s3=a[6]*100+a[7]*10+a[8];
if((a[0]+s1+(s2/s3*1.0))==10.0)
{
count++;
//printf("%.0f+%.0f/%.0f+%.0f%.0f%.0f/%.0f%.0f%.0f\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);
}
}while(next_permutation(a,a+9));
printf("%d",count);
return 0;
}
刷题链接: link.
从标准输入读入一个正整数N (N<1000*1000)
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
100
11
105
6
#include
using namespace std;
int a[15],c=0;
void judge(int n)
{
int s1=0;
for(int i=0;i<7;i++)
{
s1=s1*10+a[i];
if(s1>n)
break;
int s2=0;
for(int j=i+1;j<8;j++)
{
s2=s2*10+a[j];
int s3=0;
for(int k=j+1;k<9;k++)
{
s3=s3*10+a[k];
if(s3>s2)
break;
}
if((s1+s2/s3)==n&&s2%s3==0)
c++;
}
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<9;i++)
a[i]=i+1;
do{
judge(n);
}while(next_permutation(a,a+9));
printf("%d",c);
return 0;
}
#include
#include
using namespace std;
int main()
{
double a[10];
for(int i=0;i<9;i++)
a[i]=i*1.0+1;
do
{
double s1=a[0]*1000+a[1]*100+a[2]*10+a[3];
double s2=a[4]*10000+a[5]*1000+a[6]*100+a[7]*10+a[8];
if(s2==s1*3.0)
{
printf("%.0f/%.0f=1/3\n",s1,s2);
return 0;
}
}
while(next_permutation(a,a+9));
return 0;
}
刷题链接: link.
#include
using namespace std;
int main()
{
string s="AA223344";
set sset;
sort(s.begin(),s.end());
//cout<::iterator it=sset.begin();it!=sset.end();it++)
set::iterator it=sset.begin();
cout<<*it<