博文

行列式和它的全排列(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......

阅读全文(3016) | 评论:1

万年历全集(2006-01-02 15:14:00)

摘要:程序可以实现如下三种功能:
求某个日期对应的星期
求某年某月有的天数
输出某年的日历.
例如,打印2006年日历如下:
--------------------------------------------------------------------------
                               2006 年
--------------------------------------------------------------------------
               一   月                                二   月                周日 周一 周二 周三 周四 周五 周六  周日 周一 周二 周三 周四 周五 周六  
 1    3    5    7    9   11   13  ......

阅读全文(2575) | 评论:3

爱因斯坦的思考题(2005-12-30 13:46:00)

摘要:/*爱因斯坦的思考题
在网上看到了个有趣的逻辑推理题,爱因斯坦声称世界上只有2%的人能解出: 有五个具有五种不同颜色的房间排成一排; 每个房间里分别住着一个不同国籍的人; 每个人都在喝一种特定品牌的饮料,抽一特定品牌的烟,养一特定的宠物; 没有任意两个人在抽相同品牌的香烟,或喝相同品牌的饮料,或养相同的宠物。   问题:谁在养鱼作为宠物?   爱因斯坦给出如下线索:
英国人住在红色的房子里; 瑞典人养狗作为宠物; 丹麦人喝茶; 绿房子紧挨着白房子,在白房子的左边; 绿房子的主人喝咖啡; 抽Pall Mall牌香烟的人养鸟; 黄色房子里的人抽Dunhill牌香烟; 住在中间那个房子里的人喝牛奶; 挪威人住在第一个房子里面; 抽Blends牌香烟的人和养猫的人相邻; 养马的人和抽Dunhill牌香烟的人相邻; 抽BlueMaster牌香烟的人和啤酒; 德国人抽Prince牌香烟; 挪威人和住在蓝房子的人相邻; 抽Blends牌香烟的人和喝矿泉水的人相邻。
编了一个,比较粗糙,比较复杂,敬请改进:           
           国家           房子           宠物           饮料           香烟
           挪威           黄色&nbs......

阅读全文(1959) | 评论:0

连连看游戏(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......

阅读全文(7131) | 评论:0

一个实用的小程序--魔术师翻牌(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......

阅读全文(3181) | 评论:0

用数组解决约瑟夫环的几个算法(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......

阅读全文(6352) | 评论:3

"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......

阅读全文(2527) | 评论:0

"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);//输出最后的......

阅读全文(2495) | 评论:0

"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可能的数的集合: ......

阅读全文(2970) | 评论:1

教师管理程序(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......

阅读全文(3113) | 评论:0