有更好的算法吗?

helpall 2003-04-04 02:32:30
// please use jbuilder to run it.
import java.awt.*;
import java.util.*;

import javax.swing.*;
import com.borland.jbcl.layout.*;

public class Chess extends JPanel {
static final int SIZE=19;

public Chess(){
super();
setBackground(Color.pink);
}

public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().setLayout(new XYLayout());
f.getContentPane().add(new Chess(),new XYConstraints(25, 25, 350, 350));
f.setSize(400,400);
f.pack();
f.setVisible(true);
}

public void drawAxis(Graphics g) {
int W = getWidth(); int H = getHeight();
g.setColor(Color.gray);
for(int i = 0; i <= SIZE+1; i++){
int h = (int)(i*H/(SIZE+1));
int w = (int)(i*W/(SIZE+1));
if( i%2 == 1 ){
g.fillRect((int)(W/(SIZE+1)),h,W-(int)(W/(SIZE+1)),(int)(H/(SIZE+1)));
}
}

boolean up = true;
int w0 = (int)(W/(SIZE+1));
g.setColor(Color.lightGray);
for(int i = 0; i <= SIZE+1; i++){
int w = (int)(i*W/(SIZE+1));
if( i%2 == 1 ){
up = (i/2) % 2 == 0;
int h = 1;
int l = up?2:3;

while(h < SIZE+1) {
if(up) {
g.fillRect(w,(int)(h*H/(SIZE+1)),
w0,(int)(l*H/(SIZE+1)));
h +=l;
l = 3;
}else
h ++;
up = !up;
}
}
}

}


public void paint(Graphics g){
super.paint(g);
drawAxis(g);
}
}
...全文
23 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
有一个我觉得更清楚的方法,先画深灰横条,再画浅灰竖条(全部盖在横条上),然后对每一个交叉点(正方形)重新绘制颜色,应该是每隔一个换一种颜色。
这样肯定不会出现缝隙,时间代价是一样的,呵呵
helpall 2003-04-04
  • 打赏
  • 举报
回复
感谢各位参与.
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
算法还可以吧,时间代价是O(n^2),暂时没想出更好的。
画出来的图案有点问题,浅灰色条的上端有缝隙
helpall 2003-04-04
  • 打赏
  • 举报
回复
谢谢bjzhanghao(八进制). 我觉得你的算法很有意思. 结!!
kreven 2003-04-04
  • 打赏
  • 举报
回复
支持啊,你好强啊!:)
helpall 2003-04-04
  • 打赏
  • 举报
回复
现在只是对算法不满意.其他问题没有.
这里也只有drawAxis有点算法.把程序运行一下就看出来了.是画编织带的算法.
cxx1997 2003-04-04
  • 打赏
  • 举报
回复
你想改进那一部分的算法?稍微描述一下你的程序的作用,现在的问题,大家也好帮你
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
我前面都说了,不是为了更快
而且这样画出来的横竖相交处保证没有缝隙
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
我觉得读起来更好懂啊,而且改一下条件还可以画别的图案。
全部代码:
import java.awt.*;
import java.util.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;

public class Chess extends JPanel {
static final int SIZE=19;

public Chess(){
super();
setBackground(Color.pink);
}

public static void main(String[] args) {
JFrame f = new JFrame();
f.getContentPane().setLayout(new XYLayout());
f.getContentPane().add(new Chess(),new XYConstraints(25, 25, 350, 350));
f.setSize(400,400);
f.pack();
f.setVisible(true);
}

public void drawAxis(Graphics g) {
int W = getWidth(); int H = getHeight();
g.setColor(Color.gray);
//画横线
for(int i = 0; i < SIZE; i++){
int h = (int)(i*H/SIZE);
if( i%2 == 1 ){
g.fillRect((int)(W/SIZE),h,W-(int)(W/SIZE),(int)(H/SIZE));
}
}

//画竖线
g.setColor(Color.lightGray);
for(int i = 0; i < SIZE; i++){
int w = (int)(i*W/SIZE);
if( i%2 == 1 ){
g.fillRect(w,(int)(H/SIZE),(int)(H/SIZE),W-(int)(W/SIZE));
}
}

//处理交叉点
g.setColor(Color.gray);
for(int i=0;i<SIZE;i++){
int w = (int)((i+1)*W/SIZE);
for(int j=0;j<SIZE;j++){
int h = (int)((j+1)*H/SIZE);
if((i*j)%8==0&&(i+j+2)%4==0)
g.fillRect(w,h,(int)(W/SIZE),(int)(H/SIZE));
}
}
}

public void paint(Graphics g){
super.paint(g);
drawAxis(g);
}
}
iceshape1 2003-04-04
  • 打赏
  • 举报
回复
确实没必要这么改
算法的复杂度没有变化
bluesmile979 2003-04-04
  • 打赏
  • 举报
回复
这样算法还是和helpall的差不多
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
搞定了,条件改成
if((i*j)%8==0&&(i+j+2)%4==0)
我就觉得不应该这么复杂嘛
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
第一个循环画横线,第二个画竖线,第三个处理交叉点(涂成深灰)
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
大概的意思,主要是(i*j)%8==0&&!(i%4==0&&j%4==0)&&!(i==0||j==0)&&(i%2==0&&j%2==0)这个条件,没想好怎样确定,现在这个程序边上画得不对,而且条件太复杂了也不好看。代码倒是比较清楚。
public void drawAxis(Graphics g) {
int W = getWidth(); int H = getHeight();
g.setColor(Color.gray);
for(int i = 0; i < SIZE; i++){
int h = (int)(i*H/SIZE);
int w = (int)(i*W/SIZE);
if( i%2 == 1 ){
g.fillRect((int)(W/SIZE),h,W-(int)(W/SIZE),(int)(H/SIZE));
}
}

g.setColor(Color.lightGray);
for(int i = 0; i < SIZE; i++){
int h = (int)(i*H/SIZE);
int w = (int)(i*W/SIZE);
if( i%2 == 1 ){
g.fillRect(w,(int)(H/SIZE),(int)(H/SIZE),W-(int)(W/SIZE));
}
}

g.setColor(Color.gray);
for(int i=0;i<SIZE;i++){
int w = (int)((i+1)*W/SIZE);
for(int j=0;j<SIZE;j++){
int h = (int)((j+1)*H/SIZE);
if((i*j)%8==0&&!(i%4==0&&j%4==0)&&!(i==0||j==0)&&(i%2==0&&j%2==0))
g.fillRect(w,h,(int)(W/SIZE),(int)(H/SIZE));
}
}
}
helpall 2003-04-04
  • 打赏
  • 举报
回复
能实现一下吗?
bjzhanghao 2003-04-04
  • 打赏
  • 举报
回复
1、
-----
-----
-----

2、
----- ||||| +++++
----- + ||||| = +++++
----- ||||| +++++

3、
+++++ .....
+++++ + ..... = 结果
+++++ .....
helpall 2003-04-04
  • 打赏
  • 举报
回复
?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧