博文
迷宫的算法(2006-04-23 22:08:00)
摘要:/* Name: 迷宫的算法 Copyright: Author: Date: 23-04-06 20:53 Description: 1。建立迷宫(外围建筑围墙),可选择人工创建迷宫或计算机随机创建迷宫,还可修改迷宫 2。设置入口和出口。 3。寻找最短路径。 4。若找到可行路径,打印路径,否则报告错误。*/
#include <iostream>#include <time.h>using namespace std;
const int M = 20; //最大行数const int N = 20; //最大列数enum {OPEN, CLOSE, PASSED, ROAD=-1}; //分别表示该点通,不通,已走和属于所选路径
class MiGong{ struct stype{//存储每个路径点的有关数据;横坐标,纵坐标和其前驱在数组中的位置 int x; int y; int pre; } way[M*N];
int zx[4];//存储东南西北四个方向所对应的x的值 int zy[4];//存储东南西北四个方向所对应的y的值 int begin[2];//存储入口坐标 int end[2]; //存储出口坐标 ......
第24次比赛第2题之测试程序:(2006-04-17 20:51:00)
摘要:第2题之测试程序:/* Name: Tic-Tac-Toe Copyright: original Author: goal00001111 Date: 12-04-06 10:25 Description: tic-tac-toe 是在3*3的棋盘上进行对弈的游戏。两个玩家在方格上轮流放置自己的棋子。 谁先获得行,列或对角线上的连续3个方格,谁就获胜。 请编写一个程序与其他程序进行tic-tac-toe比赛。 我创建了一个棋盘,供两位选手对弈。选手根据我提供的当前棋盘布局情况,选择合适的棋子落点。 注意:棋子要下在适当的空白处,若落子在已有棋子的地方或超出棋盘界限,判负。 函数接口:void ChooseMove(const int board[][3], int & row, int & column); 输入:当前棋盘布局board[][3],棋盘上某点的行号row和列号column,行号和列号均从0开始. 输出:棋子落点的坐标 row, column 当前棋盘布局board[][3],空为0, 我方为1, 敌方为2.我会在测试程序中对棋盘布局board[][3]进行实时变更,使得面对每一个选手程序均为:空为0, 我方为1, 敌方为2. 评分方法:每一轮比赛由2个程序进行3局对弈,前两局分先,第3局猜先。每局对弈打平各得1分,胜利者得2分,失败者不得分。比赛按提交楼层顺序,每3个程序为一组(每人最多提交2个程序,如果超过2个则只取最后修改的2个程序)。每组进行循环赛,即组内任意2个程序进行一轮比赛。分组剩余的程序如果为1个则自动晋级。如果为2个则2个程序作为一组进行比赛。第一次循环赛结束后,每组得分最高的程序晋级,......
第24次比赛第1题之测试程序 (2006-04-17 20:50:00)
摘要:
第1题之测试程序:/* Name: 选美大奖赛 Copyright: c 语言趣味程序 Author: 梁见斌 Date: 13-04-06 16:08 Description:在选美大奖赛的半决赛现场,有一批选手参加比赛,比赛的规则是最后的得分越高,名次越低。当半决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不要考虑同名次的选手人数。例如:选手序号:1,2,3,4,5,6,7选手得分:5,3,4,7,3,5,6则输出名次为:3,1,2,5,1,3,4请编程帮助大奖赛组委会完成半决赛的评分排名工作。函数接口:void ScorePlace(int place[], const int score[], int num);输入:存储选手名次的数组place[],存储选手得分的数组score[],选手人数num。输出:存储选手名次的数组place[]。示例1:输入:score[] = {2,8,5,1,10,5,9,9};输出:place[] = {2,4,3,1, 6,3,5,5};示例2:输入:score[] = {7,7,6,6,7};输出:place[] = {2,2,1,1,2};*/#include <iostream>#include <time.h>using namespace std;void ScorePlace(int place[], const int score[], int num);void ScorePlace_c(int place[], const int score[], int num);int ......
妙用数学原理巧解编程趣题(2006-04-02 16:37:00)
摘要: 妙用数学原理巧解编程趣题有这样一道有趣的题目:有编号为1--100的灯初始状态是全开着的,现进行如下操作:A 编号是1的倍数灯拨一下开关,(开--关算一次拨操作;关--开算一次拨操作);B 是2的倍数灯再拨一下开关;C 是3的倍数的灯再拨一下开关;。。。。。。如此直到100的倍数。问:此时有哪些编号的灯是熄灭的?累积熄灭的灯的个数,并输出其编号。
初看此题并不难,思路很快出来:创建一个整型数组用来存储所有灯的状态,设初值为0,表示灯初始状态是全开着的。遍历数组,从1到100对每个编号进行倍数判断操作,对满足条件的灯进行一次拨操作。最后判断有哪些编号的灯是熄灭的,即判断数组中哪些元素的值为1。具体代码如下:例程1:#include <iostream>using namespace std;
int Shift(int light); //执行一次拨操作
int main() { const int N = 100;//灯的总数 int a[N] = {0}; //整型数组用来存储所有灯的状态,设初值为0,表示灯是全开着的 for (int i=0; i<N; i++)//遍历数组 for (int j=i+1; j>0; j--) //穷举所有不大于当前编号的数 { if ((i+1)%j == 0) //如果j是当前编号i+1的约数,即i+1是j的倍数,则执行一次拨操作 a[i] = Shift(a[i]);//也可用a[i] = (a[i] == 0)? 1 : 0; 实现 } int sum = 0; //用来累计熄灭的灯的个数 cout << "熄灭的灯的编号:" << endl; for (int i=0; i<N; i++)//累积熄灭的灯的个数,并输出其编号 { &n......
第18次比赛第2题程序(2006-03-05 12:01:00)
摘要:/*iAkiak热衷于网络俄罗斯方块对战游戏。为了能够赢得更多的比赛,他决定编写一个俄罗斯方块的外挂程序。他希望这个程序能够尽快的把游戏中所有的方块消除。
虽然俄罗斯方块游戏几乎耳熟能详、人尽皆知,但为了让大家明确,还是先介绍一下:
俄罗斯方块游戏内有19种不同的4*4的方块组合。每种组合都只有4个连续的有效方块(用*表示),其余部分是空白方块(用0表示)。有的方块仅仅是其他方块旋转得到的。下面列举出所有19种方块,为了便于讨论,给它们依次编号0..18:
**** *0000000 *0000000 *0000000 *000(0) (1)
0*00 0*00 ***0 *000***0 **00 0*00 **000000 0*00 0000 *0000000 0000 0000 0000(2) (3) (4) (5)
0**0 *000 **00 0*00**00 **00 0**0 **000000 0*00 0000 *0000000 0000 0000 0000(6) (7) (8) (9)
**00**0000000000(10)
*000 00*0 **00 ***0*000 ***0 0*00 *000**00 0000 0*00 00000000 0000 0000 0000(11) (12) (13) (14)
0*00 ***0 **00 *0000*00 00*0 *000 ***0......
第17次编程比赛第2题解法(2006-02-25 18:10:00)
摘要:/* 现有3×3的九个方格,空出中心的方格,将数字1-8随机的放入到其它的8个方格中,数字1不动,其它的数字可以移动, 最终,使所有数字按1-8的顺序顺时针排列外围方格中。移动的规则是: 都可以移向横排或竖排相临空着的方格,而且,都可以移向中心空着的方格。 要求计算出移动移动最少的次数。 函数接口: int minMove(int a[]); 其中 a[] 表示从左上角顺时针放入的8个数。*//*2006-2-25*/ /*算法介绍: 1。设定位置标号:从左上角按顺时针依次设定位置标号为1-8,中间的空格位置标号为0。*2。创建一个类,其对象为数字1-8。为每个对象的属性包括位置标号pos和数字大小num。*3。定义一个对象数组,数组元素依次为数字1-8。为方便起见,这里使每个元素的大小等于其下标值。*4。从数字2开始依次按照移动规则操作每个数字,使其按顺序顺时针排列到外围方格中。 操作方法:若数字n(2 <= n <=8 )已经位于n-1之后,则对n不做任何操作,直接操作n+1; 若数字n不在n-1之后,则: 1。若n处于中间的方格中(指位置标号为2,4,6,8处,非中间空格处),则将其移至中间空格处,然后将其位置前面的数字依次按逆时针移动,直到空出一个合适的方格,即方格的前一位置处是数字n-1,将n移到该空方格处。 2。若n不处于中间的方格中(即位置标号为1,3,5,7处),则将其移到中间的方格中。 具体操作为:将n位置前面的数字移至中间空格处,然后将它及其位置后面的数字依次按逆时针移动,直到空出一个合适的方格,即方格的后一位置处的数字比n大或者是数字1,将中间空格处的......
我的第15次编程比赛第2题程序(2006-02-13 10:02:00)
摘要:/*有十个开关等间距排成一线,每个开关对应其上方的一盏灯(十盏灯也排成一线)。每按动一下开关,可以使对应的灯改变状态(原来亮着的将熄灭,原来熄灭的将被点亮)。但是,由于开关之间的距离很小,每次按动开关时,相邻的一个开关也将被按动。例如:按动第5个开关,则实际上第4、5、6个开关都被按动。而按动靠边的第1个开关时,第1、2个开关都被按动。并且,无法只按动最靠边的一个开关。现在给出十盏灯的初始的状态和目标状态,要求计算:从初始状态改变到目标状态所需要的最少操作次数。函数接口:int MinChange(const int Start[],const int End[]);其中:Start表示了初始状态,End表示了目标状态。表示状态的数组(Start和End)中,若某元素为0表示对应的灯亮着,否则表示对应的灯没有亮。调用函数时保证Start和End数组长度均为10,并保证有解。*操作方法:设当前灯编号为i,其下一盏灯编号为i+1若i灯的初始状态与末状态相同,且i+1灯的初始状态与末状态相同:i = i + 1,不按开关;若i灯的初始状态与末状态相同,但i+1灯的初始状态与末状态不同:i = i + 2,按下开关;若i灯的初始状态与末状态不同,不论i+1灯的初始状态与末状态是否相同:i = i + 1,按下开关。若出现无解的情况,则操作次数取32768; 从左边和右边各顺序操作一次,取操作数较小的返回 *注:因为按照如上的操作方法,最边上的两个开关是不用亲自去按的;而这样会漏掉一些解。所以把初始状态扩展到4种情况:1。与给定的初始状态一模一样2。在原状态下,先按下最左边的开关 3。在原状态下,先按下最右边的开关4。在原状态下,先按下最左边和最右边的开关*//*2006-2-12 梁见斌*/ #include <iostream>#include <cmath>
using namespace std;
int MinChange(const int Start[],const int End[]);//把初始状态扩展到四种情况 void Change(int array[], int lable, int max);//按下开关,改变对应的灯及其相邻的灯的状态 int DMinChange(const int start[], const in......
解线性方程组--十字链表,速度飞快(2006-01-11 15:34:00)
摘要:/*按规则输入线性方程组的系数(每行N+1个数值,按顺序输入N个系数项,最后一项为常数项,用空格隔开),输出该方程组的系数行列式和它的值,最后输出方程组的解*//*处理实型数据,电脑随机输入数据*/ /*2006-1-11 梁见斌*/ #include <stdio.h>#include <stdlib.h> #define N 10 //行列式的行(列)数 #define MAXRC 100 //假设矩阵的行(列)数最多为100typedef struct matnode{ int row, col; //结点的行域和列域 struct matnode *right, *down;//结点的向下域(down)和向右域(right) union //结点的数据域,若为表头结点则无数值,而用指向其后继的指针代替 { float data; struct matnode *next; } tag;} CrossNode, *CrossList;typedef struct node{ float data; //存储元素的值 int x; //存储元素的横坐标 int y; //存储元素的纵坐标 } array; float sum; //全局变量,存储行列式的值
void Create(float H[][N], float X[]); //构造一个行列式 void PrintH(const float H[][N], const float X[]); //输出行列式 void CreateHead(CrossList Head[], int len); //创建十字链表的表头结点 void Insert(CrossList Head[], int r, int c, float v); //插入新的结点 CrossList ArrayToCrossList(const float A[][N], in......
行列式和代数余子式(2006-01-07 15:59:00)
摘要:/*创建行列式(人工输入数据),输出该行列式和代数余子式,并输出其值*/
/*2006-1-7 梁见斌*/
#include <stdio.h>#include <stdlib.h> #define N 3
typedef struct node{ int data; //存储元素的值 int x; //存储元素的横坐标 int y; //存储元素的纵坐标 } array;
int sum; //全局变量,存储行列式的值
void Create(int H[][N]); //构造一个行列式 void PrintH(const int H[][N]); //输出行列式 void PrintYH(const int YH[][N-1]);//输出代数余子式void SolveH(const int H[][N], array S[], int i, int NiXu); //采用递归方式求行列式的值void SolveYH(const int YH[][N-1], array S[], int i, int NiXu);//采用递归方式求代数余子式的值bool Judge(const array S[], int line, int len); //判断行列式的元素的纵坐标是否重复
int main(void){ array SL[N]; //栈,存储行列式的每一个乘积项的元素(因子) int H[N][N], YH[N-1][N-1]; //存储行列式和代数余子式 int Y[N][N];//存储代数余子式的值 int x, y, row, col; int i, j, k; Create(H); //构造一个行列式 PrintH(H); //输出行列式 sum = 0; SolveH(H, SL, 0, 0); //采用递归方式求行列式的值 printf("D = %d\n",......
解线性方程组(2006-01-07 12:10:00)
摘要:/*按规则输入线性方程组的系数(每行N+1个数值,按顺序输入N个系数项,最后一项为常数项,用空格隔开),输出该方程组的系数行列式和它的值,最后输出方程组的解*//*处理整型数据*/ /*2006-1-7 梁见斌*/
#include <stdio.h>#include <stdlib.h> #define N 4 //行列式的行(列)数
typedef struct node{ int data; //存储元素的值 int x; //存储元素的横坐标 int y; //存储元素的纵坐标 } array; int sum; //全局变量,存储行列式的值
void Create(int H[][N], int X[]); //构造一个线性方程组 void PrintH(const int H[][N], const int X[]); //输出行列式 void Solve(const int H[][N], array S[], int i, int NiXu); //采用递归方式求行列式的值bool Judge(const array S[], int line, int len); //判断行列式的元素的纵坐标是否重复
int main(void){ array SL[N]; //栈,存储行列式的每一个乘积项的元素(因子) int H[N][N], CH[N][N]; //存储系数行列式 int B[N]; //存储常数项 int D; //存储系数行列式的值 float X[N];//存储方程组的解 int i, j, k; Create(H,B); //构造一个行列式 PrintH(H,B); //输出行列式 sum = 0; Solve(H, SL, 0, 0); //采用递归方式求行列式的值 D = sum; printf("......
