- #include <stdio.h>
- void test(int x[])
- {
- int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
- int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
- if(a*3==b) printf("%d / %d\n", a, b);
- }
- void f(int x[], int k)
- {
- int i,t;
- if(k>=9){
- test(x);
- return;
- }
- for(i=k; i<9; i++){
- {t=x[k]; x[k]=x[i]; x[i]=t;}
- f(x,k+1);
- _____________________________________________ // 填空处
- }
- }
- int main()
- {
- int x[] = {1,2,3,4,5,6,7,8,9};
- f(x,0);
- return 0;
- }
结果:
- #include <stdio.h>
- void test(int x[])
- {
- int a = x[0]*1000 + x[1]*100 + x[2]*10 + x[3];
- int b = x[4]*10000 + x[5]*1000 + x[6]*100 + x[7]*10 + x[8];
- if(a*3==b) printf("%d / %d\n", a, b);
- }
- void f(int x[], int k)
- {
- int i,t;
- if(k>=9){
- test(x);
- return;
- }
- for(i=k; i<9; i++){
- {t=x[k]; x[k]=x[i]; x[i]=t;}
- f(x,k+1);
- {t=x[k];x[k]=x[i];x[i]=t;}// 填空处
- }
- }
- int main()
- {
- int x[] = {1,2,3,4,5,6,7,8,9};
- f(x,0);
- return 0;
- }
- {t=x[k];x[k]=x[i];x[i]=t;}
项目二: 加法变乘法
我们都知道: 1+2+3+ ... + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号, 使得结果为 2015
比如:
1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015
就是符合要求的答案.
请你寻找另外一个可能的答案, 并把位置靠前的那个乘号左边的数字提交 (对于示例, 就是提交 10).
- #include<stdio.h>
- int main()
- {
- int sum=1225;
- int tmp1,tmp2;
- for(int i=1;i<47;i++)
- {
- tmp1=sum-(i+i+1)+(i*(i+1));
- for(int j=i+2;j<49;j++)
- {
- tmp2=tmp1-(j+j+1)+(j*(j+1));
- if(tmp2==2015)
- printf("%d\n",i);
- }
- }
- return 0;
- }
- 16
项目三: 牌型种数
小明被劫持到 X 赌城, 被迫与其他 3 人玩牌.
一副扑克牌 (去掉大小王牌, 共 52 张), 均匀发给 4 个人, 每个人 13 张.
这时, 小明脑子里突然冒出一个问题:
如果不考虑花色, 只考虑点数, 也不考虑自己得到的牌的先后顺序, 自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数, 不要填写任何多余的内容或说明文字.
dp[i][j]=∑k=j−4jdp[i−1][k]
- #include <stdio.h>
- typedef long long LL;
- LL dp[14][14]; // dp[i][j]: 当前到第 i 张牌, 总共有 j 张牌时的解的个数
- int main() {
- dp[1][0] = dp[1][1] = dp[1][2] = dp[1][3] = dp[1][4] = 1;
- for (int i = 2; i <= 13; i++) {
- for (int k = 0; k <= 13; k++) {
- if (k - 4>= 0) dp[i][k] += dp[i-1][k-4];
- if (k - 3>= 0) dp[i][k] += dp[i-1][k-3];
- if (k - 2>= 0) dp[i][k] += dp[i-1][k-2];
- if (k - 1>= 0) dp[i][k] += dp[i-1][k-1];
- dp[i][k] += dp[i-1][k];
- }
- }
- printf("%d",dp[13][13]);
- return 0;
- }
- 35981800
项目四: 移动距离
X 星球居民小区的楼房全是一样的, 并且按矩阵样式排列. 其楼房的编号为 1,2,3...
当排满一行时, 从下一行相邻的楼往反方向排号.
比如: 当小区排号宽度为 6 时, 开始情形如下:
- 1 2 3 4 5 6
- 12 11 10 9 8 7
- 13 14 15 .....
我们的问题是: 已知了两个楼号 m 和 n, 需要求出它们之间的最短移动距离 (不能斜线方向移动)
输入为 3 个整数 w m n, 空格分开, 都在 1 到 10000 范围内
w 为排号宽度, m,n 为待计算的楼号.
要求输出一个整数, 表示 m n 两楼间最短移动距离.
例如:
用户输入:
6 8 2
则, 程序应该输出:
4
再例如:
用户输入:
4 7 20
则, 程序应该输出:
5
资源约定:
峰值内存消耗 <256M
CPU 消耗 < 1000ms
请严格按要求输出, 不要画蛇添足地打印类似:"请您输入..." 的多余内容.
所有代码放在同一个源文件中, 调试通过后, 拷贝提交该源码.
注意: main 函数需要返回 0
注意: 只使用 ANSI C/ANSI C++ 标准, 不要调用依赖于编译环境或操作系统的特殊函数.
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件.
提交时, 注意选择所期望的编译器类型.
- #include <iostream>
- #include <math.h>
- using namespace std;
- int main()
- {
- int w, m, n;
- int i, j, k = 1;
- int mi, mj, ni, nj;
- cin>> w>> m>> n;
- int arr[1001][w];
- for (i = 0; i<1001; i++)
- {
- if ((i + 1) % 2 != 0)
- {
- for (j = 0; j<w; j++)
- {
- arr[i][j] = k + j;
- }
- k = arr[i][j - 1];
- }
- else{
- int f = 1;
- for (j = w - 1; j>= 0; j--, f++)
- {
- arr[i][j] = k + f;
- }
- k = arr[i][0] + 1;
- }
- }
- for (i = 0; i<1001; i++)
- {
- for (j = 0; j<w; j++)
- {
- if (arr[i][j] == n)
- {
- ni = i;
- nj = j;
- }
- if (arr[i][j] == m)
- {
- mi = i;
- mj = j;
- }
- }
- }
- int a = abs(mi - ni);
- int b = abs(mj - nj);
- printf("%d\n",a+b);
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2997356.html