7,763
社区成员
发帖
与我相关
我的任务
分享
Dim a As Single
Dim b As Single
Private Sub picdraw_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
a = X
b = Y
End Sub
Private Sub picdraw_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Picdraw.Cls
Picdraw.Circle ((a + X) / 2, (b + Y) / 2), (((a - X) ^ 2 + (b - Y) ^ 2) ^ 0.5) / 2, RGB(0, 0, 0)
End If
End Sub
//试题编号:0186
//海龟圈地
//难度级别:D; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
//试题描述
// 海龟小蛮在沙滩上趾高气扬地走来走去,并且蛮横地宣布:“凡我足迹所到之处均为本海龟的领地。”
// 海龟的任何行动均可分解为下面三个基本动作:
// f 向前爬一格
// l 原地左转90度
// r 原地右转90度
// 由于小蛮不允许别的海龟经过它的领地,所以,由它足迹围成的封闭区域也就都成了它的领地。
// 你的任务是编程序根据文件输入的小蛮的一系列基本动作,计算出小蛮共霸占了多少格的领地。
// 程序文件主名为turtle。
// 为加深对题意的理解,我们观察下面的基本动作序列:
// flffflfffrfrrffflf
// 小蛮在出发点当然会留下足迹#,如果把它开始的方向设为向下,可以把它的足迹(用*标出的位置)画成下面的示意图:
// ****
// * *
// # *
// ****
// 显然,小蛮的领地总数为15格。
//输入
// 其中只有一个长度不超过1000的字符串,且该字符串不包含'f'、'l'、'r'之外的字符。
//输出
// 其中只有一个正整数,即领地总格数。
//输入示例
// flffflfffrfrrffflf
//输出示例
// 15
//其他说明
// 2011年北京市海淀区中学组赛题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000
static char n[2*MAXN+2][2*MAXN+2];//记录某处被爬过信息:0未爬过|1爬过
char f;//当前方向'N'|'S'|'W'|'E'
int x,y;//当前位置
char p[MAXN+1];
int i,L;
int a,b,h,t;
int sp=0;
int x1[MAXN];
int x2[MAXN];
int y1[MAXN];
int yy1,xx1,xx2;
void push(int ay1,int ax1,int ax2) {
y1[sp]=ay1;
x1[sp]=ax1;
x2[sp]=ax2;
if (sp<MAXN-1) {
sp=sp+1;
} else {
printf("stack overflow!\n");
exit(1);
}
}
void pop(void) {
sp=sp-1;
yy1=y1[sp];
xx1=x1[sp];
xx2=x2[sp];
}
//void show() {
// int zy,zx;
//
// for (zy=0;zy<2*MAXN+2;zy++) {
// for (zx=0;zx<2*MAXN+2;zx++) {
// printf("%d",n[zy][zx]);
// }
// printf("\n");
// }
// printf("\n");
//}
void scanlinefill() {
int xx,ax1,ax2;
while (1) {
if (sp<=0) break;//
pop();
// printf("O yy1,xx1,xx2=%d,%d,%d\n",yy1,xx1,xx2);
for (xx=xx1;xx<=xx2;xx++) n[yy1][xx]=2;//填充本条线
yy1++;
if (yy1<=2*MAXN)
for (xx=xx1;xx<=xx2;xx++) {//从左往右考查紧挨下面一条线各点
if (n[yy1][xx ]==0) {
ax1=xx-1;
while (1) {//向左找非0点
if (n[yy1][ax1]!=0) break;
ax1--;
}
ax1++;//非0点右边为新扫描线左点
}
if (n[yy1][xx ]==0) {
ax2=xx+1;
while (1) {//向右找非0点
if (n[yy1][ax2]!=0) break;
ax2++;
}
ax2--;//非0点左边为新扫描线右点
// printf("I yy1,ax1,ax2=%d,%d,%d\n",yy1,ax1,ax2);
push(yy1,ax1,ax2);//记录新扫描线到堆栈中
xx=ax2+1;//下次循环从该新扫描线右点的右边开始考查
}
}
}
}
int main() {
scanf("%s",p);
f='S';
y=MAXN;
x=MAXN;
n[y][x]=1;
L=strlen(p);
for (i=0;i<L;i++) {
switch (p[i]) {
case 'f':
switch (f) {
case 'N':y--;n[y][x]=1;break;
case 'S':y++;n[y][x]=1;break;
case 'W':x--;n[y][x]=1;break;
case 'E':x++;n[y][x]=1;break;
}
break;
case 'l':
switch (f) {
case 'N':f='W';break;
case 'S':f='E';break;
case 'W':f='S';break;
case 'E':f='N';break;
}
break;
case 'r':
switch (f) {
case 'N':f='E';break;
case 'S':f='W';break;
case 'W':f='N';break;
case 'E':f='S';break;
}
break;
}
}
// show();
for (y=0;y<2*MAXN+2;y++) {n[y][0]=2;n[y ][2*MAXN+1]=2;}
for (x=0;x<2*MAXN+2;x++) {n[0][x]=2;n[2*MAXN+1][x ]=2;}
// show();
push(1,1,2*MAXN);//从(y1==1,x1==1,x2==2*MAXN)开始
scanlinefill();//往下使用扫描线种子填充算法填充2
// show();
a=0;
for (y=0;y<2*MAXN+1;y++) {
for (x=0;x<2*MAXN+1;x++) {
if (n[y][x]!=2) a++;
}
}
printf("%d\n",a);
return 0;
}
' ◢██▆▄
' ◢█████▆▄
' ◢████████▆▄
' ◢███████████▆▄
'◢██████████████▆▄
'██████◥█████████◤
'◥█████ ████████◤
' ◥████ ███⊕███◤
' ◥███ ██████◤
' ◥██ █████◤
' ████◤
' ███◤
' ██◤
这种情况下要把那个区域全部填满,还得用其它的边界搜索算法才行。
Dim rgbColor As String
Dim dr As Single
Dim dg As Single
Dim db As Single
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
rgbColor = Hex(Me.Point(x, y))
rgbColor = Change2RGB(rgbColor)
Call printline(x, y)
End Sub
Private Sub Form_paint()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Circle (2000, 2000), 1000, RGB(0, 0, 0)
Circle (2800, 2800), 1000, RGB(0, 0, 0)
End Sub
Private Function printline(x As Single, y As Single)
'左侧查找
Dim lx As Single
Dim ly As Single
Dim rx As Single
Dim ry As Single
Dim loopflag As Boolean
loopflag = True
lx = x - 1
Do While loopflag
If Change2RGB(Me.Point(lx, y)) <> rgbColor Then
loopflag = False
Else
lx = lx - 1
End If
Loop
'右侧查找
loopflag = True
rx = x + 1
Do While loopflag
If Change2RGB(Me.Point(rx, y)) <> rgbColor Then
loopflag = False
Else
rx = rx + 1
End If
Loop
Me.Line (lx, y)-(rx, y), RGB(Val(Text1.Text), Val(Text2.Text), Val(Text3.Text))
End Function
Private Function Change2RGB(c As String)
Select Case Len(c)
Case 1: Change2RGB = "00000" & c
Case 2: Change2RGB = "0000" & c
Case 3: Change2RGB = "000" & c
Case 4: Change2RGB = "00" & c
Case 5: Change2RGB = "0" & c
End Select
End Function