博文
幻方的几种构造方法(2007-06-15 16:45:00)
摘要:幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.(以下程序输入的 n 要求 n<30 并且 n 为奇数,输入0 结束)
构造 1 :#include <stdio.h>#include <string.h>
void out(int n){ int i,j,k,a[32][32]; memset(a,0,sizeof(int)*32*32); j=n/2+1; a[1][j]=1; for(k=2;k <= n*n; k ++){ i=i-1; j=j+1; if((i<1)&&(j>n)){ i=i+2; j=j-1; } else{ if(i<1) i=n; if(j>n) &......
迷宫搜索(2007-06-15 09:14:00)
摘要:/************************************************************************\ 迷宫路径搜索的过程显示,编译环境 : TC
Author : Deng Lanzhong / 江南孤峰 Time : 07--6--14 Link me : Email: lingdlz@163.com qq: 403324669\************************************************************************/
#include <stdio.h>#include <graphics.h>#include <time.h>#include <setjmp.h>
#define MAZE_X 15 /* 迷宫宽度 */#define MAZE_Y 10 /* 迷宫高度 */
char maze[MAZE_Y+2][MAZE_X+2]; /* 定义迷宫 */int maze_x_s = (640 - MAZE_X * 20) / 2; /* 迷宫起始横坐标 */int maze_y_s = (480 - MAZE_Y * 20)/2-40; /* 迷宫起始纵坐标 */int search_result = 1; /* 迷宫搜索结果 */jmp_buf jumper; /* 非局部跳转 */
/* 创建随机迷宫 */void CreateRandMaze(void){ int i,j; for(i = 0; i &l......
打印DNA(2007-06-14 16:26:00)
摘要:打印 DNA 形状
问题描述
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧! ^_^
输入
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。
输出
输出DNA的形状,每组输出间有一空行。
输入样例
23 15 4
输出样例
X X XX X
X X X X X X XX X X X X X XX X X X X X XX X X X X X XX X
// MY CODE 07-6-14
#include <stdio.h>#include <string.h>#define MAX 42
void SetMetrix(char m[][MAX], int a){ int i,j; for(i = j = 0; i < a; i++,j++) m[i][j] = 'X'; for(j=a-1,i=0; i < a; i++,j--) m[i][j] = 'X'; for(i=0, j=a; i < a; i++) m[i][j] = '\0';}
void Print(char m[][MAX], int a, int b){ int i,j; for(j = i = 0; j <= b; ){ printf("%s\n",m[i]); j = (i==0 ? j+1 : j); i = (i==a-2 ? 0 ......
旅行家的预算(acm)(2007-06-08 08:17:00)
摘要:旅行家的预算 Problem description 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市
之间的距离D1、汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2、出发点每升汽油价格P和沿
途油站数N(N可以为零),油站i离出发点的距Di、每升汽油价格 Pi( i=l,2,...N)。计算结果四舍
五入至小数点后两位。如果无法到达目的地,则输出“No solution”。
Input 输入数据的第一行是四个实数;D1 C D2 P分别表示两个城市之间的距离,汽车油箱的容量,每升汽油能行驶的距离,出发点每升汽油价
格;第二行是一个整数N,沿途的油站数。第三行到第N+2,每一行是一个油站的基本信息描述,包括该油站离出发点的距离,该油站每升汽油的价
格。
Output 输出到达目的城市的最小费用(四舍五入到两位小数),若不能到达目的城市则输出 No solution
Sample Input 275.6 11.9 27.4 2.82102.0 2.9220.0 2.2 Sample Output 26.95 Problem Source NOI
// 测试用例275.6 11.9 17.4 2.82102.0 2.9220.0 2.2142.54
275.6 11.9 10.4 2.83 102.0 2.1160.2 2.3220.0 2.262.99 // mycode 2007--6--8
#include <stdio.h>#include <float.h>
typedef struct node{ float d; float j; float dist;}NODE;
int main(){ float money,maxoil,totald,spee......
半数集问题(2007-06-06 20:24:00)
摘要:问题描述
问题描述: 给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。 (1) n∈set(n); (2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半; (3) 按此规则进行处理,直到不能再添加自然数为止。 例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。 注意半数集是多重集。
编程任务: 对于给定的自然数n,编程计算半数集set(n)中的元素个数。
输入
输入数据m行,每行给出一个整数n。(0〈n〈1000)
输出
输出只有m行,每行给出半数集set(n)中的元素个数。
输入样例
699
输出样例
69042
// mycode ,这里是“多重集”,非多重集有点麻烦
#include <stdio.h>
int a[1000],aj;
void get(int n){ int i,j,k; for(i=aj+1; i <= n; i++){ k = i/2; for(a[i]=j=1; j <= k; j++) a[i] = a[i] + a[j]; } aj = n;}int main(){ int n; aj = a[0] = a[1] = 1; while(scanf("%d",&n)!=EOF){ if(n > aj) get(n); printf("%d\n",a[n]); } return 0;}......
24点速算(2007-06-06 14:13:00)
摘要:问题描述
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。
输入
输入数据占一行,给定四张牌。
输出
如果有解则输出"Y",无解则输出"N"。
输入样例
A 2 3 6
输出样例
Y
// my code 2007--6--6#include <stdio.h>
#include <ctype.h>
int Get(int j, int sum,int a[]){
if(j==4 && sum==24)
return 1;
else if(j==4)
return 0;
if(Get(j+1,sum+a[j],a))
return 1;
if(Get(j+1,sum-a[j],a))
return 1;
if(Get(j+1,sum*a[j],a))
return 1;
if(Get(j+1,sum/a[j],a))
return 1;
return 0;
}
int main(){
int i,j,k,t,a[4];
char d[4];
scanf("%c %c %c %c",&d[0],&d[1],&d[2],&d[3]);
for(i = 0; i < 4; i++)
a[i] = (isdigit(d[i]) ? d[i]-48 : d[i]-64);
for(i = k = 0; k < 24; k++){
if(Get(1,a[0],a)){
printf("Y\n");
return 0;
}
j = (i >= 3 ? 0 : i+1);
t = a[i];
a[i] = a[j];
a[j] = t;
i = j......
排队买票(2007-06-05 22:51:00)
摘要:问题描述
有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问
这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置
互换,也算是一种新的排法。(M<=10)
输入
输入一行,M,N,K(其中M=N+K,M<=10).
输出
输出一行,总的排队方案。
输入样例
4 2 2
输出样例
8
/*********************************************** 题目可能不是很难,和排列组合有关,我的数学不是 很好但这题能想到解法,不过却想了很久不知道怎么 表达这个解法,开始用想用普通数组通过递归求解。 没解决,最后终于想到了二叉树,呵呵,总算解决了 不过遗憾,开始没考虑特殊数据 1 1 0 ,WA了一次 题目 M<=10,以下程序不受此限制。 --- 2007--6--5 --- ***********************************************/
#include <stdio.h>#include <malloc.h>
typedef struct tree{ int i,dibs; struct tree *left,*right,*parent;}TREE;
TREE* GetTreeNode(void){ TREE *temp; temp = (TREE*)malloc(sizeof(TREE)); temp->dibs = temp->i = 0; temp->left = temp->right = temp->parent = NULL; return temp;}
void CreateTree(int n, int k, TREE **p){ TREE *temp; if(n==0 && k==0) return ; if(n >= 1){ &n......
女人真正想要什么(2007-06-04 21:06:00)
摘要:大学时的一堂语文课上,老师讲了一个故事:年轻的亚瑟国王被邻国的伏兵抓获。邻国的君主被亚瑟的年轻和乐观所打动,没有杀他。并承诺只要亚瑟可以回答一个非常难的问题,他就可以给亚瑟自由。亚瑟有一年的时间来思考这个问题。如果一年的时间还不能给他答案,亚瑟就会被处死。
这个问题是:女人真正想要的是什么?
这个问题连最有见识的人都困惑难解,何况年轻的亚瑟,对于他这是个无法回答的问题。但总比死亡要好得多,亚瑟接受了国王的命题在一年的最后一天给他答案。
亚瑟回到自己的国家,开始向每个人征求答案:公主,妓女,牧师,智者,宫庭小丑。他问了所有的人,但没有人可以给他一个满意的回答。人们告诉他去请教一个老女巫,只有她才能知道答案。但是他们警告他,女巫的收费非常高,因为她昂贵的收费在全国是出名的。一年的最后一天到了,亚瑟别无选择,只好去找女巫。女巫答应回答他的问题,但他必须首先接受她的交换条件: 和亚瑟王最高贵的圆桌武士之一,他最亲近的朋友--加温结婚。亚瑟王惊骇极了,看看女巫:驼背,丑陋不堪,只有一个牙齿,身上发出臭水沟般难闻的气味,而且经常制造出猥亵的声音。他从没有见过如此不合谐的怪物。
他拒绝了,他不能强迫他的朋友娶这样的女人而让自己背付沉重的精神包袱。加温知道这个消息后,对亚瑟说:"我同意和女巫结婚,没有比拯救亚瑟的生命和保存圆桌更重要的事了。"
于是婚礼宣布了。女巫于是回答了亚瑟的问题:女人真正想要的是主宰自己的命运。
每个人都立即知道了女巫说出了一个伟大的真理,亚瑟的生命被解救了。
于是邻国的君主放了亚瑟王并给了他永远的自由。来看看加温和女巫的婚礼吧,这是怎样的婚礼呀!
亚瑟王在无法解脱的极度痛苦中哭泣。加温一如既往的谦和,而女巫却在庆典上表现出她最坏的行为:她用手抓东西吃,打嗝,**,让所有的人感到恶心,不舒服。
新婚的夜晚来临了:加温依然坚强地面对可怕的夜晚,走进新房。是怎样的景象在等待着他呀!一个他从没见过的美丽的少女半躺在婚床上!加温惊呆了,问她到底是怎么回事。
美女回答说,因为当她是个丑陋的女巫时加温对她非常的好,于是她在一天的时间里一半是她可怕的一面,另一半是她美少女的一面。那么加温想要她在白天或夜晚是哪一面呢?
多么残酷的问题呀!加温开始思考他的困境:在白天向朋友们展现一个美丽的女人,而......
马拦过河卒(2007-06-02 21:49:00)
摘要:马拦过河卒
时间限制:10000MS 内存限制:65536KTotal Submit:9 Accepted:3
问题描述
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳
跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达
B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
输入
一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)
输出
一个数据,表示所有的路径条数。
输入样例
6 6 3 3
输出样例
6
题目来源
// MY CODE (注意卒不能通过马所在的位置,象棋里是可以的)
#include <stdio.h>
struct node{ int right; int down; int x,y;}stack[40];
struct horse{ int x,y;}horse[8];
int test(int x,int y,struct horse *h,int k){ int i; for(i = 0; i < k; i++) if(h[i].x == x && h[i].y == y) return 1; return 0;}
int main(){ int xd,yd,xh,yh,i,k,m; int b[] = {-2,-1,1,2,2,1,-1,-2}; int c[] = {1,2,2,1,-1,-2,-2,-1};
while(scanf("%d%d%d%d",&xd,&yd,&xh,&yh)!=EOF){ for(k = i = 0; i < 8; i++){ &nb......
回文(2007-06-02 12:58:00)
摘要:回文数(一)
时间限制:10000MS 内存限制:65536KTotal Submit:33 Accepted:10
问题描述
若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回
文数。 给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则
停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。 例如:87则有: STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 编写一个程序,输入M(12<=M<=100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可
能得到回文数,则输出0。
输入
第1行一个正整数L,代表测试数据的组数。 接下来L行每行一个整数M(12<=M<=100),M本身不为回文数;
输出
输出L行,第i行对应输入数据的第i+1行,输出最少需要的步数;如果步数大于8,则输出0。
输入样例
3128789
输出样例
140
// my code
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>
void revsStr(char *str){ unsigned int i,j; char c; for(i = 0,j = strlen(str)-1; j > i; i++,j--){ c = str[i]; str[i] = str[j]; str[j] = c; }}
int testStr(char *str){ int i,j; for(i = 0,j = strlen(str)-1; j > i; i++,j--) if(str[i] != str[j])&nb......
