2012年1月26日星期四

assembly language 实验九中的问题

在屏幕中间分别显示三种颜色的字符串“welcome to MASM”
80 * 25的彩色字符显示缓冲区

代码:


data segment
db 'welcome to MASM!'
db 02h,01h,04h
data ends


stack segment
dw 8 dup(0)
stack ends


code segment
    assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,[11*160]
mov di,0
mov ax,0b800h
    
mov cx,3    ;outer loop
   s1: push cx
push ax
push di
mov es,ax
mov si,0
mov di,0

mov cx,16
   s2: mov al,ds:[di]
mov es:[bx+si],al
inc di
add si,2
loop s2      ;set the even byte in display memory

mov si,1     ;odd byte
pop di       ;set color
mov al,ds:[16+di]    ;load color
mov cx,16
   s3: mov es:[bx+si],al
add si,2
loop s3

;ready for next turn
inc di        ;next color style
pop ax
add ax,0ah
;add bx,160    ;next row
pop cx
loop s1

mov ah,4ch
int 21h
code ends
end start




这个是显示正常的,通过修改ax来改段地址(绿色字体),已达到指向下一行的目的。但是,我原先的想法是通过改变bx的值来指向下一行(红色字体),不知何故没有显示正常。。。囧
但是理论上应该是一样的啊??bx自增160到下一行的行首,和ax自增16效果应该是一样的啊。。。这里面有什么玄机?debug了好久也没找出来,菜了。。。。囧


2012年1月24日星期二

POJ 1750 Dictionary 模拟水题

这题目最后说的blank line number着实让人摸不着头脑,也就不管了。。。算法也没什么太多可以说的,就是做完之后发现这runtime 700+ms... = =!
网上有影射的code,发觉效率真的高不少啊,其实就是将for输出的blank用影射实现了,确实节省一定的时间。。。细节问题呢~总是想不到这种取巧的方法,是coding太少,还没有这意识吧...囧



#include<cstdio>
const int N = 100001,M = 11;
char list[N][M];


int main()
{
int i = 0,j = 0,total = 0;
while(scanf("%s",list[total]) != EOF)
total ++;
int blank = 0,substr = 0;
printf("%s\n",list[0]);
for(i = 1;i < total;i ++){
j = substr = 0;
while(list[i][j] != '\0'){      //control the space number whitout "0",TLE for this T_T
if(list[i][j] != list [i - 1][j])break;
else substr ++;
j ++;
}
if(substr > blank)blank ++;      //main algorithm
else blank = substr;
for(int k = 0;k < blank;k ++)
printf(" ");
printf("%s\n",list[i]);
}
return 0;
}

2012年1月15日星期日

POJ 2159 Ancient Cipher(hash)

开始也是被简单的题目坑了。。。。考完试之后的第一道练手题啊,悲催 T_T
再细心看了一次之后,思路还是蛮清晰的。就是要求字符串中不同字母出现的次数一一对应。比如ABABC和DDEEF就应该是yes,如果是DDEEE就是no。但实现起来还是嫌麻烦。总是觉得有太多不需要的语句,很臃肿。涉及快排啊,比较啊。然后看到一个hash的算法就果断跪了 = =

题目归结为判断两个自然数多集(允许有重复元素的集合)a, b是否相等。用快排比较的效率是O(nlgn),下面提出一种O(n)的方法供大家参考。
 猜想:若 sum(a^i) = sum(b^i),i = 0, 1, 2, 则 a = b。 
证明:略。。。俺数学也不好  = = 


注意 :sum(s^0) 是多集s中元素的数目 
      sum(s^1) 是多集s中元素的和 
      sum(s^2) 是多集s中元素的平方和




追求代码的简洁之道。与其随便的实现,不如多花些时间去想。。。从小就懒啊,没办法