Bmp2Asc 所谓的短学期设计

归类于程序人生 参与评论

话说2个礼拜前在学校是做短学期,然后做完了就回家去了~恩,现在都结束了,在清理电脑的时候发现了这个代码~
反正也没什么用了,贴一下留作纪念吧
程序很简单,就是一个把bmp图片转化成asc字符画的程序~
三个.c文件三个.h文件~
其实这几个.h文件写的不是很好,如果写一下#ifdef的话应该会更加好
先是bmp文件读写的.h文件和.c

1
2
3
4
5
6
7
8
9
10
11
12
/*
 *  bmpRW.h
 *  bmp2ascii
 * 
 *  Created by zerob13 on 6/30/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
#include<string.h>
#include <stdio.h>
#include<stdlib.h>
int BmpRead(char*,unsigned char *,BITMAPINFOHEADER *);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 *  bmpRW.cpp
 *  bmp2ascii
 *
 *  Created by zerob13 on 6/30/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
#include "Typedef.h"
#include "bmpRW.h"
 
int BmpRead(char* fp,unsigned char *pimage,BITMAPINFOHEADER *bb){
 
	BITMAPFILEHEADER *bmpfh; //bmp文件头指针
	BITMAPINFOHEADER *bmpih; //bmp文件信息头指针
	unsigned char *data; //bmp文件数据指针
	int i=0;
	int IMAGE_SIZE;
	/*
	 bmp文件头读取
	 */
	FILE *file=fopen(fp,"rb+");
	bmpfh=(BITMAPFILEHEADER*)malloc(sizeof(BITMAPFILEHEADER));
	if(!bmpfh)
	{
		printf("Memory not enough!\n");
		exit(1);
	}
	fseek(file,sizeof(short),SEEK_SET);
	fread(bmpfh,sizeof(BITMAPFILEHEADER),1,file);
	/*
	 bmp文件信息头读入
	 */
	bmpih=(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
	if(!bmpih)
	{
		printf("Memory not enough!\n");
		exit(1);
	}
	fseek(file,sizeof(BITMAPFILEHEADER)+sizeof(short),SEEK_SET);
	fread(bmpih,sizeof(BITMAPINFOHEADER),1,file);
	/*
	 bmp文件数据读入
	 */
	IMAGE_SIZE=(bmpih->biSizeImage);
	data=(unsigned char*)calloc(IMAGE_SIZE,sizeof(char));
	if(!data)
	{
		printf("Memory not enough!\n");
		exit(1);
	}
	fseek(file,bmpfh->bfOffBits,SEEK_SET);   
    fread(data,IMAGE_SIZE,1,file);   
    fclose(file);   
	for(i=0;i<IMAGE_SIZE;i++ )   
    {   
        *(pimage+i)=*(data+i); 
    }   
	memcpy(bb,bmpih,sizeof(BITMAPINFOHEADER));
	free(data);
	free(bmpih);
	free(bmpfh);
	return IMAGE_SIZE;
}

然后是转换的部分

1
2
3
4
5
6
7
8
9
10
/*
 *  buff2asc.h
 *  bmp2ascii
 *
 *  Created by zerob13 on 7/1/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
 
void buff2asc(int ,int ,int ,unsigned char *,char ansmap[][Max_W]);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
 *  buff2asc.c
 *  转换ascii函数
 *
 *  Created by zerob13 on 7/1/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
#include"Typedef.h"
#include"bmpRW.h"
#include "buff2asc.h"
void buff2asc(int size,int h,int w,unsigned char *buffer,char ansmap[][Max_W]){
	int i,j,k;
	i=j=0;
	for(k=0;k<size;k+=3)
	{
 
		if(buffer[k]!=255){
			ansmap[i][j++]=' ';
		}
		else{
			ansmap[i][j++]='@';
 
		}
		if(j==w)
		{
 
			while(k%4){		//bmp文件每行必须%4为0
				k++;		//否则要用0x00补足
			}				//故这里要通过这个去掉补足用的0x00
			j=0;
			i++;
		}
	}
	return ;
 
}

之后是比较重要的一个.h函数,定义了bmp文件的一些信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 *  Typedef.h
 *  bmp2ascii
 *	This file includes all types about bmp.
 *  Created by zerob13 on 6/30/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
 
typedef short WORD;
typedef int DWORD;
typedef unsigned int LONG;
typedef char BYTE;
#define Max_W 800
#define Max_H 800
/*
 *位图文件头
 *
 */
typedef struct tagBITMAPFILEHEADER {
    //WORD    bfType; 
    DWORD   bfSize; 
    WORD    bfReserved1; 
    WORD    bfReserved2; 
    DWORD   bfOffBits; 
} BITMAPFILEHEADER;
/*
 *位图信息头
 *
 */
typedef struct tagBITMAPINFOHEADER{ 
    DWORD  biSize; 
    LONG   biWidth; 
    LONG   biHeight; 
    WORD   biPlanes; 
    WORD   biBitCount; 
    DWORD  biCompression;
    DWORD  biSizeImage; 
    LONG   biXPelsPerMeter; 
    LONG   biYPelsPerMeter; 
    DWORD  biClrUsed; 
    DWORD  biClrImportant; 
} BITMAPINFOHEADER;
/*
 *颜色表
 */
typedef struct tagRGBQUAD { 
    BYTE    rgbBlue; 
    BYTE    rgbGreen; 
    BYTE    rgbRed; 
    BYTE    rgbReserved; 
} RGBQUAD;
 
/*
 *位图信息
 *
 */
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD              bmiColors[1];
} BITMAPINFO;

最后是主函数~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 *  main.c
 *  主函数部分
 *
 *  Created by zerob13 on 7/1/10.
 *  Copyright 2010 __MyCompanyName__. All rights reserved.
 *
 */
//头文件部分
#include"Typedef.h"//bmp文件类型的头文件
#include"bmpRW.h"//bmp文件读写头文件
#include"buff2asc.h"//转换为ascii的头文件
 
int main (int argc, char * const argv[]) {
 
	unsigned char *buffer;//缓冲区,用于储存图片色彩矩阵
	int size;//图片大小
	BITMAPINFOHEADER *bmpih;//图片信息头,用于获取图片分辨率
	int w,h;//图片分辨率
	char fp[2048],fp2[2048];//输入文件,输出文件的地址
	char ansmap[Max_H][Max_W];//输出ascii矩阵
	int i,j;
	FILE *out;//输出文件指针
	//获取空间
	buffer=(unsigned char*)malloc(3*Max_W*Max_H);
	bmpih=(BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER));
	//判断工作模式,图片地址是否已经从参数中输入
	if(argc==1){
		printf("please input your file:)\n");
		scanf("%s",fp);
 
	}else{
		if(argc==2)
		{
			strcpy(fp,argv[1]);
		}else{
			printf("Error\n");
			exit(1);
		}
	}
	//生成输出文件
	strcpy(fp2,fp);
	strcat(fp2,"-answer.txt");
	out=fopen(fp2,"w+");
	//读入数据
	size=BmpRead(fp,buffer,bmpih);
	i=0;j=0;
	h=bmpih->biHeight;
	w=bmpih->biWidth;
	//转换图像
	buff2asc(size,h,w,buffer,ansmap);
	//输出结果
	for(i=h-1;i>=0;i--)
	{
		fwrite(ansmap[i],sizeof(ansmap[i]),1,out);
		for(j=0;j<w;j++)
		{
			printf("%c",ansmap[i][j]);
		}
		puts("");
		fwrite("\n",sizeof("\n"),1,out);
	}
	fclose(out);
    return 0;
}

最后是makefile~

1
2
3
4
5
6
7
8
9
10
11
CC=gcc
bmp2ascall:main.o bmpRW.o buff2asc.o
	$(CC) -o $@ $^
buff2asc.o:buff2asc.c bmpRW.h Typedef.h buff2asc.h
	$(CC) -c $<
bmpRW.o:bmpRW.c bmpRW.h Typedef.h
	$(CC) -c $<
main.o:main.c bmpRW.c buff2asc.c bmpRW.h Typedef.h buff2asc.h
	$(CC) -c $<
clean:
	rm main.o bmpRW.o buff2asc.o

126 views , , , , , ,

简单写的遗传算法求极大值

归类于程序人生 一条评论

新手,比较简单,凑合看看~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*    Copyright (C) 2010  zerob13 <zerob13@gmail.com> */
#include <iostream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
#define MAXNUM 1023;//种群范围
#define NUMLEN 10//种群编码长度
#define	STNUM 200//种群个体数目
#define PC 0.007//变异率
#define AGE 100//迭代种群代数
double Fsun;//储存所有值的和
void itoa(int a,int ans[])//输入整数a,和数组ans,然后,a的二进制会存放在ans里。(当然你也可以直接用系统自带的itoa)
{
	int i,j;
	int co=0;
	while(a!=1&&a){
		ans[co++]=a%2;
		a/=2;
	}
	if(a)
	{
		ans[co++]=1;
	}
	for(i=0,j=NUMLEN-1;i<j;j--,i++)
	{
		ans[i]^=ans[j];
		ans[j]^=ans[i];
		ans[i]^=ans[j];
	}
}
 
int atoi2(int ans[])//输入二进制数组返回整数值 如数组ans[]={0,0,0,0,0,1,0,1},就会返回5
{
	int an=0,i;
	for(i=0;i<NUMLEN;i++)
	{
		an+=ans[i]*(1<<(NUMLEN-1-i));
	}
	return an;
}
 
void getrand(int ra[])//获取1~MAXNUM的随机初始种群 放在你输入的数组ra[]中
{
 
	srand(time(NULL));
	for(int i=0;i<STNUM;i++)
	{
		ra[i]=1+rand()%MAXNUM;
	}		
}
 
void getP(double P[])//获取0~1随机数 放在你输入的数组P[]中,作为选择概率用
{
	srand(time(NULL));
	for(int i=0;i<STNUM;i++)
	{
		P[i]=double(rand()%10000)/10000.0;
	}
 
 
}
 
int getValue(int va)//获取适应度
{
	return va*va;
}
 
double getchoseP(int va)//获取选择概率
{
	return (double)va/Fsun;
}
 
void creatAP(double P[],double AP[])//获取积累概率
{
	int i,j;
	for(i=0;i<STNUM;i++)
	{
		AP[i]=0.0;
		for(j=0;j<=i;j++)
		{
			AP[i]+=P[j];
		}
	}
	return ;
}
 
int getPcNum()//获取变异位数
{
	return (int)(PC*NUMLEN*STNUM);
}
 
void Exchange(int ans[STNUM][NUMLEN])//交叉运算
{
	int i,j,k,c;
	k=getPcNum();
	for(i=0;i<STNUM-1;i+=2)
	{
		for(j=NUMLEN-5;j<NUMLEN;j++)
		{
			ans[i][j]^=ans[i+1][j];
			ans[i+1][j]^=ans[i][j];
			ans[i][j]^=ans[i+1][j];
		}
 
 
	}
	while(k--){		
		c=rand()%(NUMLEN*STNUM);
		ans[c/NUMLEN][c%STNUM]^=1;
 
	}
 
 
	return ;
}
 
int main (int argc, char * const argv[]) {
 
	int ans[STNUM][NUMLEN];
	int ra[STNUM];
	int rb[STNUM];
	int i,j;
	double P[STNUM];
	double AP[STNUM];
	double Cp[STNUM];
	int maxx,maxn;
	int flag=0;
	memset(ans,0,sizeof(ans));
	for(Fsun=0,i=1;i<512;i++)
	{
		Fsun+=getValue(i);
	}
	maxx=0;
	maxn=0;
	getrand(ra);
	for(i=0;i<STNUM;i++){
 
		if(maxx<getValue(ra[i]))
		{
			maxx=getValue(ra[i]);
			maxn=ra[i];
		}
 
	}
 
	while(flag<AGE)
	{
		flag++;
		for(i=0;i<STNUM;i++)
		{
			Cp[i]=getchoseP(getValue(ra[i]));
		}
		creatAP(Cp,AP);
		getP(P);
		for(i=0;i<STNUM;i++)
		{
			for(j=0;j<STNUM;j++)
			{
				if(j==0)
				{
					if(P[i]<=AP[j])
					{
						rb[i]=ra[j];
						break;
					}
				}else {
					if(P[i]<=AP[j]&&P[i]>AP[j-1]){
 
							rb[i]=ra[j];
							break;
						}
				}
 
			}
			itoa(rb[i],ans[i]);
		}
 
		Exchange(ans);
		for(i=0;i<STNUM;i++)
		{
			ra[i]=atoi2(ans[i]);
 
			if(getValue(ra[i])>maxx)
			{
				flag=0;
				maxn=ra[i];
				maxx=getValue(ra[i]);
			}
		}
	}
	printf("%d\n",maxn);
 
    return 0;
}

288 views , , , ,

写了一个android上的代码浏览器

归类于程序人生 2 条评论

一直希望在android上看代码~不过貌似一直没找到好的软件~
所以嘛,自己动手丰衣足食啦~~~
0.1版本只支持java/c/c++高亮(因为自己对这几个语言比较熟悉。。。)
写了两天,基本上能用了。

截图如下~

APK文件我也发上来吧,喜欢的朋友可以拿去用~
Codereader 0.1.apk

319 views , , , , , , ,

Java写的创意时钟,纯属好玩,没任何实用价值的说~

归类于程序人生 参与评论

先上图吧,有个图比较好解释:)

绿色的圈代表秒,蓝色代表分,品红代表小时
分别以当前的秒所占一分钟的比率,当前的分所占一小时的比率,以及当前的小时所占1天的比率画出弧度~
思路相当简单,不过实现起来还是比较好玩的:)
稍稍修改了一下,现在应该符合常识了
编译好的jar文件在这里下载
http://cid-d94239a09a81fece.skydrive.live.com/self.aspx/.Public/aa.jar
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import javax.swing.*;
import java.util.*;
import java.awt.*;
 
public class ClockPanel {
 
	/**
	 * @param args
	 */
	JFrame frame;
	Canvas ab;
	Clock kk;
	int hh, mm, ss;
	Calendar cal = null;
 
	ClockPanel() {
		frame = new JFrame("Clock");
		frame.setBackground(Color.white);
		ab = new Canvas();
		ab.setSize(400, 400);
		ab.setBackground(Color.red);
		frame.setSize(400, 400);
		frame.add(ab);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		kk = new Clock(this);
		begin();
	}
 
	/**
	 * 画图函数,就是很简单的用Calendar类获得当前时间,然后弧形
	 */
	void draw() {
		Graphics g = ab.getGraphics();
		g.setColor(Color.red);
		g.fillRect(0, 0, 400, 400);
		g.setColor(Color.green);
		cal = Calendar.getInstance();
		hh = cal.get(Calendar.HOUR_OF_DAY);
		mm = cal.get(Calendar.MINUTE);
		ss = cal.get(Calendar.SECOND);
		g.drawString("Nowtime:" + hh + ":" + mm + ":" + ss, 40, 60);
		int ars = 6 * ss;
		int arm = 6 * mm;
		int arh = 360 / 24 * hh;
		g.fillArc(100, 100, 200, 200, 90, -ars);
		g.setColor(Color.blue);
		g.fillArc(130, 130, 140, 140, 90, -arm);
		g.setColor(Color.magenta);
		g.fillArc(150, 150, 80, 80, 90, -arh);
	}
 
	void begin() {
		(new Thread(kk)).start();// 线程启动!
	}
 
	public static void main(String[] args) {
		ClockPanel a = new ClockPanel();
	}
 
}
 
/**
 * 这个是用来控制画图的线程,每秒刷新
 * 
 * @author yanglingfeng
 * 
 */
class Clock implements Runnable {
	ClockPanel a = null;
 
	Clock(ClockPanel in) {
		a = in;
		a.draw();
	}
 
	@Override
	public void run() {
		while (true) {
			try {
				a.draw();
				Thread.sleep(1000);// 1秒刷新
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
 
		}
	}
 
}

175 views , , , ,

线性表

归类于程序人生 参与评论

c++很久没用了。。。好生疏阿。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <iostream>
using namespace std;
 
typedef int ElemType;
const int MaxNum=100;
 
class List {
	public :
	ElemType list[MaxNum+1];
	int size;
	void Clear(){
		this->size=0;
	}
	int GetSize(){
		return this->size;
	}
	bool isEmpty(){
		if(this->size)
			return false;
		else 
			return true;
	}
 
	ElemType GetElem(int pos)
	{
		if(0<=pos && pos<size)
		return this->list[pos];
		else {
			exit(1);
		}
 
	}
 
	bool find(ElemType& it)
	{
		int i;
		for(i=0;i<size;i++)
		{
			if(it==this->list[i])
				return true;
		}
		return false;
	}
 
	bool update(int pos,const ElemType& it){
		int i;
		for(i=0;i<size;i++)
		{
			if(it==this->list[i]){
				this->list[i]=it;
				return true;
			}
		}
		return false;
	}
	bool InsertRear(const ElemType& it){
 
		if(size>=MaxNum)
			return false;
		this->list[size]=it;
		size++;
		return true;
	}
	bool InsertFront(const ElemType& it){
 
		int i;
		if(size>=MaxNum)
			return false;
		for(i=size;i>0;i--){
			this->list[i]=this->list[i-1];
		}
		this->list[0]=it;
		size++;
		return true;
 
	}
	bool Insert(int pos,const ElemType& it){
		int i;
		if(size>=MaxNum)
			return false;
		for(i=size;i>pos;i--){
			this->list[i]=this->list[i-1];
		}
		this->list[pos]=it;
		size++;
		return true;
	}
	ElemType DeletFront(){
		int i;
		if(size==0)
			exit(1);
		ElemType temp=this->list[0];
		for(i=0;i<size-1;i++)
		{
			this->list[i]=this->list[i+1];
		}
		return temp;		
	}
 
	ElemType Delet(int pos){
		int i;
		if(size<=pos)
			exit(1);
		ElemType temp=this->list[pos];
		for(i=pos;i<size-1;i++)
		{
			this->list[i]=this->list[i+1];
		}
		return temp;		
	}
};
 
int main(int argc, char *argv[]) {
 
	List a;
	a.InsertFront(1);
	a.InsertRear(2);
	cout<<a.GetSize()<<endl;
	cout<<a.GetElem(0)<<endl;
	a.Insert(0,3);
	int b=1;
	cout<<a.find(b)<<endl;
	cout<<a.Delet(1)<<endl;
 
    return 0;
}

123 views , , , ,

学习matlab

归类于程序人生 参与评论

开始学习matlab了,学了一些基础的语法。
然后就开始试试画一些好玩的图形。
第一个反映就是以前看到过的一个函数
于是就开始摸索了
最后,找到了语句,成功的画出来了,成果如下

1
ezplot('17*x*x-16*abs(x)*y+17*y*y-255')

下面上函数图像~

117 views , , , ,

pku3252 哈夫曼树

归类于程序人生 2 条评论

今天开始学习学习哈夫曼树,于是就去找点题目做做,毕竟学数据结构这种东西还是让oj来验证你的想法最方便了。
google了一下,pku的3252貌似是个软柿子,捏之~
看了一些关于哈夫曼的介绍,大致有个想法了,打出来,wa。。。看来想错了。
于是再看资料,发现需要动态寻找最小的两个节点的,于是就写了一个比较暴力的,参考网上的资料。
6365627 zerob13 3253 Accepted 236K 250MS C++ 628B 2010-01-24 15:08:06

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int lef[20001];
int n;
int cmp(const void *a,const void *b)
{
	return *(int*)a-*(int*)b;
}
 
int main (int argc, char * const argv[]) {
	int i,j,k,l;
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++)
		{
			scanf("%d",&lef[i]);
		}
		qsort(lef,n,sizeof(int),cmp);
		long long int sum=0;
		for(i=1;i<n;i++)
		{
			lef[i]+=lef[i-1];
			sum+=lef[i];
			k=lef[i];
			for(j=i+1;j<n;j++)
			{
				if(k>lef[j])
				{
					lef[j-1]=lef[j];
				}else {
					break;
				}
 
			}
			lef[j-1]=k;
		}
		printf("%lld\n",sum);
	}
 
	return 0;
 
}

但是很不爽阿,感觉这种代码不是我的风格,于是打算用stl重新写一遍,于是我就开始用stl折腾了。。。
之后就出了一个效率好多了的stl版本。。。
6365653 zerob13 3253 Accepted 348K 32MS C++ 819B 2010-01-24 15:18:24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stdlib.h>
using namespace std;
int lef;
int n;
int cmp(const void *a,const void *b)
{
	return *(int*)a-*(int*)b;
}
struct node{
	int a;
	friend bool operator< (node n1, node n2)
    {
        return n1.a > n2.a;
    }
};
priority_queue<node>zerob;
int main (int argc, char * const argv[]) {
	int i,j,k,l;
	node kk;
	while(scanf("%d",&n)!=EOF){
		while(!zerob.empty()){
			zerob.pop();
		}
		for(i=0;i<n;i++)
		{
			scanf("%d",&lef);
			kk.a=lef;
			zerob.push(kk);
 
		}
 
		long long int sum=0;
		while(zerob.size()>1)
		{
			node a=zerob.top();
			zerob.pop();
			node b=zerob.top();
			zerob.pop();
			sum+=a.a+b.a;
			kk.a=a.a+b.a;
			zerob.push(kk);
		}
		printf("%lld\n",sum);
 
	}
	return 0;
 
}

269 views , , , , , , ,

Java小游戏之扫雷

归类于程序人生 2 条评论

前几天看到室长在做c#的作业,貌似是写一个扫雷。。。于是当时就想用java也写写看。。。
发现java的可视化真不是一般的难过。。。
不过,磕磕碰碰的还是写出来了,虽然样子比较挫,但是还是可以玩的
9*9 9个雷~
下面上代码~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
 
 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
 
 
/**
 *
 * @author Zerob13
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Mineb extends JButton {
	private boolean ismine;
	int x, y;
	int num;
	public boolean isMine() {
		return ismine;
	}
	public void setMine(boolean a) {
		ismine = a;
	}
	Mineb(String a, int i, int j) {
		super.setText(a);
		x = i;
		y = j;
		ismine = false;
	}
}
public class Deom extends JFrame implements MouseListener {
	/**
	 * @param args
	 */
	Mineb[][] b;
	JLabel state;
	int last;
	JMenuBar mb;
	int elas;
	class node {
		int x, y;
	}
	int[][] dir = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { -1, 1 }, { -1, -1 },
			{ 1, -1 }, { -1, 0 }, { 0, -1 } };
	private void gen() {
		int co = 0;
		elas = 81 - 9;
		last = 9;
		int[] hash = new int[81];
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				b[i][j].setText("");
				b[i][j].setEnabled(true);
				b[i][j].setMine(false);
			}
		}
		for (int i = 0; i < 81; i++) {
			hash[i] = 0;
		}
		for (; co < 9;) {
			int X = (int) (Math.random() * 81);
			if (hash[X] == 0) {
				hash[X] = 1;
				co++;
			}
		}
		for (int i = 0; i < 81; i++) {
			if (hash[i] == 1) {
				int x = i / 10, y = i % 10;
				if (x >= 9)
					x = 8;
				if (y >= 9)
					y = 8;
				b[x][y].setMine(true);
			}
		}
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				b[i][j].num = count(i, j);
			}
		}
		state.setText("9");
	}
	Deom() {
		mb = new JMenuBar();
		setJMenuBar(mb);
		state = new JLabel("");
		JMenu start = new JMenu("Start");
		JMenu http = new JMenu("http://zerob13.com");
		mb.add(start);
		mb.add(http);
		JMenuItem s = new JMenuItem("Start!!");
		start.add(s);
		ActionListener st = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				gen();
			}
		};
		s.addActionListener(st);
		setLayout(new GridLayout(10, 9, 0, 0));
		b = new Mineb[9][9];
		for (int i = 0; i < 9; i++) {
			for (int j = 0; j < 9; j++) {
				b[i][j] = new Mineb("", i, j);
				b[i][j].setSize(10, 10);
				b[i][j].addMouseListener(this);
				add(b[i][j]);
			}
		}
		add(state);
		state.setText(String.valueOf(this.last));
		setSize(500, 500);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		gen();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Deom frame = new Deom();
	}
	int count(int x, int y) {
		int i;
		int k = 0;
		for (i = 0; i < 8; i++) {
			int w = x + dir[i][0];
			int z = y + dir[i][1];
			if (w < 0 || z < 0 || w >= 9 || z >= 9)
				continue;
			if (b[w][z].isMine()) {
				k++;
			}
		}
		return k;
	}
	void showall() {
		int i, j;
 
		for (i = 0; i < 9; i++) {
			for (j = 0; j < 9; j++) {
				if (b[i][j].isEnabled()) {
					if (b[i][j].isMine()) {
						if (b[i][j].getText() == "P")
							b[i][j].setText("R");
						else
							b[i][j].setText("@");
						b[i][j].setEnabled(false);
					} else {
						if (b[i][j].num == 0) {
							if (b[i][j].getText() == "P") {
								b[i][j].setText("X");
							} else
								b[i][j].setText("-");
						} else{
							if (b[i][j].getText() == "P") {
								b[i][j].setText("X");
							}else
							b[i][j].setText(String.valueOf(b[i][j].num));}
						b[i][j].setEnabled(false);
					}
				}
			}
		}
	}
	void showsame(int x, int y) {
		int i, j, k;
		node[] queue = new node[81];
		boolean[][] hash = new boolean[9][9];
		for (i = 0; i < 9; i++) {
			for (j = 0; j < 9; j++) {
				hash[i][j] = false;
			}
		}
		node head = new node();
		node p = new node();
		head.x = x;
		head.y = y;
		int top = 0;
		int tail = 0;
		queue[tail] = new node();
		queue[tail].x = head.x;
		queue[tail].y = head.y;
		tail++;
		while (tail > top) {
			head = queue[top];
			top++;
			for (i = 0; i < 8; i++) {
				int w = head.x + dir[i][0];
				int z = head.y + dir[i][1];
				if (w < 0 || z < 0 || w >= 9 || z >= 9)
					continue;
				if(b[w][z].getText()!="")
					continue;
				if (b[w][z].isMine())
					continue;
				if (hash[w][z])
					continue;
				hash[w][z] = true;
				if (b[w][z].num == 0) {
					queue[tail] = new node();
					queue[tail].x = w;
					queue[tail].y = z;
					tail++;
					if (b[w][z].isEnabled()) {
						b[w][z].setEnabled(false);
						elas--;
					}
					b[w][z].setText("-");
				}
			}
		}
		if (elas == 0) {
			showall();
                        JOptionPane.showMessageDialog(null, "YOU WIN!", "YOU WIN!", JOptionPane.DEFAULT_OPTION);
			state.setText("WIN");
		}
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		Mineb temp = (Mineb) e.getSource();
		if (e.getButton() == MouseEvent.BUTTON1) {
			if (temp.getText() == "P" || temp.getText() == "?") {
			} else {
				if (temp.isMine()) {
					showall();
                                        state.setText("LOSE");
                                         JOptionPane.showMessageDialog(null, "YOU LOSE!", "YOU LOSE!", JOptionPane.DEFAULT_OPTION);
				} else {
					if (temp.num == 0) {
						showsame(temp.x, temp.y);
						temp.setText("-");
					} else {
						temp.setText(String.valueOf(temp.num));
					}
				}
				if (temp.isEnabled()) {
					temp.setEnabled(false);
					elas--;
				}
				if (elas == 0) {
					showall();
					state.setText("WIN");
                                         JOptionPane.showMessageDialog(null, "YOU WIN!", "YOU WIN!", JOptionPane.DEFAULT_OPTION);
				}
			}
		} else if (e.getButton() == MouseEvent.BUTTON3) {
			if (temp.getText() == "P" || this.last == 0) {
				if (temp.getText() == "P")
					this.last++;
				temp.setText("?");
			} else if (temp.getText() == "?") {
				temp.setText("");
			} else {
				temp.setText("P");
				this.last--;
			}
			state.setText(String.valueOf(this.last));
		}
	}
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
	}
}

199 views , , , , , ,

Opencv之摄像头捕获

归类于程序人生 2 条评论

今天试着写了写摄像头捕获的代码,运行成功,很好。
之后就要试试实质性的东西了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
 功能:从摄像头中得到视频流,并输出结果。
 */
#include "cv.h"
#include "highgui.h"
#include <ctype.h>
#include <stdio.h>
 
int main( int argc, char** argv )
{
    CvCapture* capture = 0;
 
    // 下面的语句说明在命令行执行程序时,如果指定AVI文件,那么处理从
	// AVI文件读取的视频流,如果不指定输入变量,那么处理从摄像头获取
	// 的视频流
        capture = cvCaptureFromCAM(0);
    if( !capture )
    {
        fprintf(stderr,"Could not initialize capturing...\n");
        return -1;
    }
    cvNamedWindow( "Laplacian", 0 );
	// 循环捕捉,直到用户按键跳出循环体
    for(;;)
    {
        IplImage* frame = 0;
        frame = cvQueryFrame( capture );
        if( !frame )
            break;
        cvShowImage("Laplacian", frame);
        if( cvWaitKey(10) >= 0 )
            break;
    }
    cvReleaseCapture( &capture );
    cvDestroyWindow("Laplacian");
    return 0;
}

521 views , , , ,

java贪吃蛇,参考网上代码

归类于摄影与我 参与评论

参考了网上的一些代码,写了一个小小的贪吃蛇,比较简单,但是学到很多。比如线程,比如绘图,还有对类的理解加深了。
两个文件的
第一个是snake的模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
 
/**
 * @author zerob13
 *
 */
import java.util.*;
import javax.swing.*;
 
class Node{
	int x,y;
	Node(int x,int y)
	{
		this.x=x;
		this.y=y;
	}
 
}
 class Snake  implements Runnable{
 
	Greedsnake gs;//界面
	boolean[][] mmap;//地图
	LinkedList nodeArray =new LinkedList();//蛇身体
	Node food;//食物
	int maxX;
	int maxY;//界面大小
	int dir=2;//方向
	boolean run=false;//运行状态
	int time=200;//速度
	boolean pause=false;
	int score=0;//分数
	int countMove=0;
	 public static final int UP = 2;
	 public static final int DOWN = 4;
	 public static final int LEFT = 1;
	 public static final int RIGHT = 3;//方向常量
	 /**
	  * 
	  * @param g 界面输入
	  * @param maxX 最大x边长
	  * @param maxY  最大y边长
	  */
	 public Snake(Greedsnake g,int maxX,int maxY)//初始化
	 {
		 this.gs=g;
		 this.maxX=maxX;
		 this.maxY=maxY;
		 mmap=new boolean[maxX][];
		 for(int i=0;i<maxX;i++)
		 {
			 mmap[i]=new boolean[maxY];
			 Arrays.fill(mmap[i], false);
		 }
 
		 int inita=maxX>20?10:maxX/2;
		 for(int i=0;i<inita;i++)
		 {
			 int x=maxX/2+i;
			 int y=maxY/2;
			 nodeArray.add(new Node(x,y));
			 mmap[x][y]=true;
		 }
		 food=creatfood();
		 mmap[food.x][food.y]=true;
	 }
	 public void changeDirection(int newDir) {
	        if (dir % 2 != newDir % 2)// 避免冲突
	        {
	            dir = newDir;
	        }
	    }
	 public boolean MoveOn(){//移动函数
		 Node n=(Node)nodeArray.getFirst();//取头部,移动
		 int x=n.x,y=n.y;
		 switch(dir)
		 {
		 case UP:
			 y--;
			 break;
		 case DOWN:
			 y++;
			 break;
		 case LEFT:
			 x--;
			 break;
		 case RIGHT:
			 x++;
			 break;
 
		 }
		 if((0<=x&&x<maxX)&&(0<=y&&y<maxY))//越界判断
		 {
			 if(mmap[x][y])//是否撞倒东西
			 {
				 if(x==food.x&&y==food.y){
					 nodeArray.addFirst(food);
					 int scoreget=(10000-200*countMove)/time;
					 score+=scoreget>0?scoreget:10;
					 countMove=0;
					 food=creatfood();
					 mmap[food.x][food.y]=true;
					 return true;
				 }else
				 {
					 return false;
				 }
			 }else{//正常移动
				 nodeArray.addFirst(new Node(x,y));//加头
				 mmap[x][y]=true;
				 n=(Node)nodeArray.removeLast();//去尾巴
				 mmap[n.x][n.y]=false;
				 countMove++;
				 return true;
 
			 }
		 }
		 return false;//over
 
	 }
	 /**
	  * 食物创造函数
	  * @return node
	  */
	private Node creatfood() {
		// TODO Auto-generated method stub
		int x=0,y=0;
		do{
			Random r=new Random();
			x=r.nextInt(maxX);
			y=r.nextInt(maxY);
 
		}while(mmap[x][y]);
		return new Node(x,y);
 
	}
	@Override
	/**
	 * 运行线程
	 */
	public void run() {
		// TODO Auto-generated method stub
		run=true;
		while(run){
			try{
				Thread.sleep(time);
 
			}catch(Exception e){
				break;
			}
			if(!pause){
				if(MoveOn()){
					gs.repaint();
 
				}else{
					JOptionPane.showMessageDialog(null, "GAME OVER",
                            "Game Over", JOptionPane.INFORMATION_MESSAGE);
					break;
 
				}
			}
		}
		run=false;
 
	}
	/**
	 * 暂停函数
	 */
	public void changePauseState() {
		pause = !pause;
    }
 
 
}

然后是主界面的绘画和调用蛇模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
 
 
/**
 * 
 * @author zerob13
 *
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
 
public class Greedsnake implements KeyListener {
 
 
	JFrame mainFrame;
	Canvas paintCanvas;
	JLabel labelScore;
	Snake snake=null;
	  public static final int canvasWidth = 200;
	    public static final int canvasHeight = 300;
	    public static final int nodeWidth = 10;
	    public static final int nodeHeight = 10;
	public Greedsnake(){
		mainFrame=new JFrame("贪吃蛇");
		Container cp=mainFrame.getContentPane();
		labelScore=new JLabel("积分:");
		cp.add(labelScore,BorderLayout.NORTH);
		paintCanvas=new Canvas();
		paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
	     paintCanvas.addKeyListener(this);
	     cp.add(paintCanvas, BorderLayout.CENTER);
	     JPanel panelButtom=new JPanel();
	     panelButtom.setLayout(new BorderLayout());
	     mainFrame.addKeyListener(this);
	        mainFrame.pack();
	        mainFrame.setResizable(false);
	        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        mainFrame.setVisible(true);
	        begin();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Greedsnake gs = new Greedsnake();
 
	}
 
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		int keyCode=e.getKeyCode();
		if(snake.run){
			switch(keyCode){
			case KeyEvent.VK_UP:
				snake.changeDirection(snake.UP);
				break;
			case KeyEvent.VK_DOWN:
				snake.changeDirection(snake.DOWN);
				break;
			case KeyEvent.VK_LEFT:
				snake.changeDirection(snake.LEFT);
				break;
			case KeyEvent.VK_RIGHT:
				snake.changeDirection(snake.RIGHT);
				break;
			case KeyEvent.VK_P:
                snake.changePauseState();// 暂停或继续
                break;
            default:
			}
		}
		if (keyCode == KeyEvent.VK_R || keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_ENTER) {
            snake.run = false;
            begin();
        }
	}
 
	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
 
	}
 
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
 
	}
	void repaint(){
		Graphics g=paintCanvas.getGraphics();
		g.setColor(Color.WHITE);
		g.fillRect(0,0,canvasWidth,canvasHeight);
		g.setColor(Color.black);
		LinkedList na=snake.nodeArray;
		Iterator it=na.iterator();
		while(it.hasNext()){
			Node n=(Node)it.next();
			drawNode(g,n);
		}
		g.setColor(Color.red);
		Node n=snake.food;
		drawNode(g,n);
		updateScore();
	}
	private void drawNode(Graphics g,Node n){
		  g.fillRect(n.x * nodeWidth, n.y * nodeHeight, nodeWidth - 1, nodeHeight - 1);
	}
	public void updateScore(){
		String s = "积分: " + snake.score;
        labelScore.setText(s);
	}
    void begin() {
        if (snake == null || !snake.run) {
        	snake = new Snake(this, canvasWidth / nodeWidth,
                    this.canvasHeight / nodeHeight);
            (new Thread(snake)).start();
        }
    }
 
 
}

143 views , , , , ,

顶部