博文
迷宫的算法(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的值
......
第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个程序)......
第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[......
妙用数学原理巧解编程趣题(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 <......
第18次比赛第2题程序(2006-03-05 12:01:00)
摘要:/*iAkiak热衷于网络俄罗斯方块对战游戏。为了能够赢得更多的比赛,他决定编写一个俄罗斯方块的外挂程序。他希望这个程序能够尽快的把游戏中所有的方块消除。
虽然俄罗斯方块游戏几乎耳熟能详、人尽皆知,但为了让大家明确,还是先介绍一下:
俄罗斯方块游戏内有19种不同的4*4的方块组合。每种组合都只有4个连续的有效方块(用*表示),其余部分是空白方块(用0表示)。有的方块仅仅是其他方块旋转得到的。下面列举出所有19种方块,为了便于讨论,给它们依次编号0..18:
**** *000
0000 *000
0000 *000
0000 *000
(0) (1)
0*00 0*00 ***0 *000
***0 **00 0*00 **00
0000 0*00 0000 *000
0000 0000 0000 0000
(2) (3) (4) (5)
0**0 *000 **00 0*00
**00 **00 0**0 **00
0000 0*00 0000 *000
0000 0000 0000 0000
(6) (7) (8) (9)
**00
**00
0000
0000
(10)
*000 00*0 **00 ***0
*000 ***0 0*00 *000
**00 0000 0*00 0000
0000 0000 0000 0000
(11) (12) (13) ......
第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处),则将其移到中间的方格中。
具体操作为:......
我的第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[]);//把初始状态扩展到四种情况
vo......
解线性方程组--十字链表,速度飞快(2006-01-11 15:34:00)
摘要:/*按规则输入线性方程组的系数(每行N+1个数值,按顺序输入N个系数项,最后一项为常数项,用空格隔开)
,输出该方程组的系数行列式和它的值,最后输出方程组的解*/
/*处理实型数据,电脑随机输入数据*/
/*2006-1-11 梁见斌*/
#include <stdio.h>
#include <stdlib.h>
#define N 10 //行列式的行(列)数
#define MAXRC 100 //假设矩阵的行(列)数最多为100
typedef 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); //创建十字链表的表头结点
......
行列式和代数余子式(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); //输......
解线性方程组(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,......