博文
行列式和它的全排列(2006-01-07 12:06:00)
摘要:/*创建行列式(电脑随机输入数据),输出该行列式和它的全排列,并输出其值*/
#include <stdio.h>
#include <stdlib.h>
#define N 3
#define M 6
typedef struct node
{
int data; //存储元素的值
int x; //存储元素的横坐标
int y; //存储元素的纵坐标
} array;
array Stack[M][N+1]; //全局变量,存储全排列的乘积项
int sum=0, count=0; //全局变量,分别存储行列式的值和乘积项的个数
void Create(int H[][N]); //构造一个行列式
void PrintH(const int H[][N]); //输出行列式
void Solve(const int H[][N], array S[], int i, int NiXu); //采用递归方式求行列式的全排列
bool Judge(const array S[], int line, int len); //判断行列式的元素的纵坐标是否重复
void Save(const array S[]); //把每一个乘积项存储到全局变量Stack[][]
void PrintS(const array S[][N+1]); //输出行列式的全排列
int main(void)
{
array SL[N+1]; //栈,存储行列式的每一个乘积项的元素(因子)
int H[N][N]; //存储行列式
Create(H); //构造一个行列式
PrintH(H); //输出行列式
Solve(H, SL, 0, 0); //采用递归方式求行列式的全排列
&n......
万年历全集(2006-01-02 15:14:00)
摘要:程序可以实现如下三种功能:
求某个日期对应的星期
求某年某月有的天数
输出某年的日历.
例如,打印2006年日历如下:
--------------------------------------------------------------------------
2006 年
--------------------------------------------------------------------------
一 月 二 月
周日 周一 周二 周三 周四 周五 周六 周日 周一 周二 周三 周四 周五 周六
1 3 5 7 9 11 13 ......
爱因斯坦的思考题(2005-12-30 13:46:00)
摘要:/*爱因斯坦的思考题
在网上看到了个有趣的逻辑推理题,爱因斯坦声称世界上只有2%的人能解出:
有五个具有五种不同颜色的房间排成一排;
每个房间里分别住着一个不同国籍的人;
每个人都在喝一种特定品牌的饮料,抽一特定品牌的烟,养一特定的宠物;
没有任意两个人在抽相同品牌的香烟,或喝相同品牌的饮料,或养相同的宠物。
问题:谁在养鱼作为宠物?
爱因斯坦给出如下线索:
英国人住在红色的房子里;
瑞典人养狗作为宠物;
丹麦人喝茶;
绿房子紧挨着白房子,在白房子的左边;
绿房子的主人喝咖啡;
抽Pall Mall牌香烟的人养鸟;
黄色房子里的人抽Dunhill牌香烟;
住在中间那个房子里的人喝牛奶;
挪威人住在第一个房子里面;
抽Blends牌香烟的人和养猫的人相邻;
养马的人和抽Dunhill牌香烟的人相邻;
抽BlueMaster牌香烟的人和啤酒;
德国人抽Prince牌香烟;
挪威人和住在蓝房子的人相邻;
抽Blends牌香烟的人和喝矿泉水的人相邻。
编了一个,比较粗糙,比较复杂,敬请改进:
国家 房子 宠物 饮料 香烟
挪威 黄色&nbs......
连连看游戏(2005-12-22 11:11:00)
摘要:连连看游戏连连看游戏是一个在10 \Theta 15 的板子上玩的单人游戏。每个方块里都有一个红球,绿球或者蓝球。两个同颜色的球属于同一串,每一个球都能被它周围上下左右四个方位同颜色的球够着(即属于同一串)。在游戏的每一个阶段中,游戏者选择一个球,这个球所属的串至少包含两个球,然后在木板上移走该串球。然后这个木板在经过以下两个阶段后被“压缩”。
1,把每一列中剩下的球往下移动以填补空位。球的排列顺序被保留。
2,如果某列中球全被拿走了,把其右边的球整列整列地尽量往左移。球的排列顺序被保留。
在下面的例子里我们选择左下角的球:(很可惜,图象传不上来)
游戏的目的是把所有的球从木板中移走,当所有的球都被移走或者每串球只剩一个的时候游戏就算结束了。每次游戏分数的计算如下:玩家开始分数为0,每移走含m个球一串球,玩家分数增加 (m-2)^2分。如果在游戏结束时所有的球都被移走,玩家将得到额外的1000分的奖励。
你猜想最好的策略可能是每次都选择拥有最大串的球,那么你要做的就是编一个程序模拟用这种策略来玩这个游戏。如果有两个或以上的球可以选择,程序将选择最左边的球来得到最大串。如果仍然有同时满足条件的,将优先选择最底端的球。
输入:
输入游戏中球最初的排列,即所谓迷宫的分布。每一行包括MaxLine个字母,每一个字母为“R”,“G”或“B”,明确给出各行各列的球的颜色,共MaxRow行。
输出:
关于每次移动的信息,和每次移动所得到的分数,每次移动的输出按照如下格式:Move x at (r,c): removed b balls of color C, got s points,其中x是移动的次序数,r和c表示被选中的球所在的行数和列数。行数从下往上数1-MaxRow总共是MaxRow行,列数从左往右数1-MaxLin总共MaxLin行。b表示被移走的那串球的个数;C表示球的颜色,可以是“R”,“G”或“B”;s是移动所得的分数。这个分数并不包括因把球全部移走而得到的额外奖励。最后的分数必须象这样公布:Final score: s, with......
一个实用的小程序--魔术师翻牌(2005-12-05 17:29:00)
摘要:/*魔术师翻牌,魔术师将扑克中的13张黑桃预先排好,牌面朝下,放在手中,
第一次数一张牌翻过来刚刚好是A,放在桌面上;第二次数MAX>1张牌,把记数分别为1,2,。。。,
(MAX-1)的那些牌,依次 放在手中牌的下面,数MAX的牌,翻过来刚刚好是2,放在桌面上;
第三次也数MAX>1张牌,把记数分别为1,2,。。。,(MAX-1)的那些牌,依次 放在手中牌的下面,
数MAX的牌,翻过来刚刚好是3,放在桌面上;这样做下去,直到13张牌翻完为止,
此时桌面上的牌顺序刚刚好是A,2,3,4,5,6,7,8,9,10,J,Q,K。
请编程找出魔术师手中的13张牌的原始顺序... */
#include <stdio.h>
#include <stdlib.h>
#define MAX 2
void Solve(int *Puke, int len); //此函数用来找出魔术师手中的13张牌的原始顺序
void show(int Puke[], int len); //此函数用来演示魔术师的翻牌顺序
int main(void)
{
int side, Puke[13]={0}, *P_Puke=Puke;//用来存储13张牌
Solve(P_Puke, 13);//此函数用来找出魔术师手中的13张牌的原始顺序
printf("原始顺序 : ");
for(side=0; side<13; side++)//输出13张牌的原始顺序
printf("%d ",Puke[side]);
printf("\n翻牌顺序 : ");
show(Puke, 13);//此函数用来演示魔术师的翻牌顺序
system("pause");
return 0;
}
void Solve(int *Puke, int len)//此函数用来找出魔术师手中的13张牌的原始顺序
{
int cou......
用数组解决约瑟夫环的几个算法(2005-11-15 10:59:00)
摘要:算法1:
/*求围圈问题的详细算法和程序*/
/*17人围成一圈,编号为1,2,3,……,17,从1开始报数,报到3的倍数的人离开,
一直下去,直到最后剩下1人,求此人的编号 */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[17]={0};
int i, count, s;
for (i = 0;i < 17;i++)
{
a[i] = i + 1; /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
}
i=0;
s=17; //用来记录退出圈外的人的数目
count=0; //计数器
while(s > 1)
{
for(i=0; i<17; i++)
if(a[i] != 0)
{
count++; //报一次数
if(count == 3) //每报到一次3,该人退出
{
printf("%d\n",a[i]);&nbs......
"S、P先生数学谜题"算法分析及源代码(3)(2005-11-13 13:55:00)
摘要:附录2:
根据算法(二)写出的程序代码:
/* S、P先生数学谜题*/
/*梁见斌 2005-11-14*/
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 99
//初步列出所有可能的p的值(M*M〈= p〈= N*N),并把每一个p的xy组合的个数作为p[i]的值
void possible1_p(int *p);
//根据p的不可能的值的集合 进一步确定 s的不可能的值的集合 ,即设该元素值为s[x+y] = 1;
void possible_us(int *s, int p[]);
//根据s的不可能的值的集合,推出s的可能的值的集合
int possible2_s(int *s);
//根据p的不可能的值的集合,推出p的可能的值的集合
int possible2_p(int *p);
//根据P的话判断出p[]的可能的值的集合
int possible3_p(int *p, int s[], int len_p, int len_s);
//根据S的话判断出s[]的可能的值的集合
int possible3_s(int *s, int p[], int len_s, int len_p);
//根据P和S的可能的值的集合,判断出X,Y的可能的值的集合
int possible_xy(int p[], int s[], int len_s, int len_p, int *px, int *py);
//输出最后的结果
void print(int x[], int y[], int len);
int main( void )
{
int len_s=0, len_p=0, len_xy;
int s[N+N+1]={0}, p[N*N+1]={0}, *ps, *pp;
&n......
"S、P先生数学谜题"算法分析及源代码(2)(2005-11-13 13:54:00)
摘要:附录1:
根据算法(一)写出的程序代码:
/* S、P先生数学谜题*/
/*梁见斌 2005-11-14*/
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 200
typedef struct{ //存放两个数之和或积的集合
int x;
int y;
int data;
} SP1;
int possible_up(SP1 *up); // 寻找p的不可能的值的集合
//根据p的不可能的值的集合 进一步确定 s的不可能的值的集合
int put_us(SP1 *us, SP1 up[], int len_us, int len_up);
int out_s(SP1 us[], SP1 *s, int len);//根据s的不可能的值的集合,推出s的可能的值的集合
int out_p(SP1 up[], SP1 *p, int len); //根据p的不可能的值的集合,推出p的可能的值的集合
int judge1(SP1 *p, SP1 s[], int len_p, int len_s);//根据P的话判断出P的可能的值的集合
int judge_s(int x, int y, SP1 s[], int len);//判断P分解的两个数之和是否属于集合S
int judge2(SP1 *s, SP1 p[], int len_s, int len_p);//根据S的话判断出S的可能的值的集合
int judge_p(int x, int y, SP1 p[], int len); //判断S分解的两个数之积是否属于集合P
//根据P和S的可能的值的集合,判断出X,Y的可能的值的集合
int possible_xy(SP1 p[], SP1 s[], int len_s, int len_p, int *px, int *py);
void print(int x[], int y[], int len);//输出最后的......
"S、P先生数学谜题"算法分析及源代码(2005-11-13 13:53:00)
摘要:S、P先生数学谜题:
设有两个自然数X、Y,2<=X<=Y<=99,S先生知道这两个数的和S,P先生知道这两个数的积 P ,他们二人进行了如下对话:
S:我确信你不知道这两个数是什么,但我也不知道。
P: 一听你说这句话,我就知道这两个数是什么了。
S: 我也是,现在我也知道了。
现在你能通过他们的会话推断出这两个数是什么吗?(当然,S和P先生都是非常聪明的)
S、P先生数学谜题的思路:
首先已声明2<=x<=y<=99,且x,y都是自然数。
1、S先生说:“我不知道这两个数。”,这就可知S决不是:
4(=2+2);5(=2+3);197(=98+99);198(=99+99)。
把这些S的不可能的值及其对应的X,Y的组合存储到数组US[]中。
2、S先生说:“我确定你也不知道这两个数。”,这就可知P决不是:
(1) 两端的数之积,如4(=2*2);6(=2*3);8=(2*4);10(=2*5);。。。
9801(=99*99);9702(=98*99);9604(=98*98)。
(2) 素数或者素数之积,如5,7,11,。。。25(=5*5),35(=5*7)。
把这些P的不可能的值及其对应的X,Y的组合存储到数组UP[]中。
UP共有2981个元素,它们是:
UP={4 5 6 7。。。4316 4327 4331 。。。9781 9787 9791 9801}
那么可以根据这些X,Y的组合求出对应的S(=X+Y)来,把它们加入到数组US[]中。这样一来,S的数又可以排除一些了。
比如6(=2+4);7(=2+5);...10(=5+5);...。
如此一来,就可以初步总结出S可能的数的集合:
......
教师管理程序(2005-04-23 07:33:00)
摘要:/*输入一组数据,包括某人的学号,姓名,性别,年龄和收入,
可以由用户决定按某种顺序排序 */
/*2005-4-22 梁见斌*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define OVERFLOW 1
typedef struct l{
char name[15];
char sex[8];
int number;
int age;
float income;
struct l *next;
}Lk;
Lk *creat(Lk stu[]);
void print(Lk *stu);
int sort_menu(void);
void sort(Lk **stu, int n) ;
void insert(Lk **stu);
void del_menu(Lk *stu);
void del_1 (Lk **stu);
void del_2 (Lk **stu);
void del_3 (Lk **stu);
void del_4 (Lk **stu);
void del_5 (Lk **stu);
void find_menu(Lk *stu);
void find_1 (Lk **stu);
void find_2 (Lk **stu);
void find_3 (Lk **stu);
void find_4 (Lk **stu);
void find_5 (Lk **stu);
int main(vo......