l**b 发帖数: 457 | 1 刚刚电面的。东欧人,320 * 200 的screen,只能表示黑白2种颜色。要求你写一个
flip的function把某个长方形区域里面的pixel由黑变成白或者由白变成黑。
小结一下,一开始就说了用bit vector,结果觉得后悔了,应该先用int array的,这
样下手会快很多。结果一下子用一个array去表示,想怎么从x,y变成array index想了
半天。大脑抽筋了。 |
p*****y 发帖数: 1386 | 2 没看懂,应该不是flip一个指定位置的pixel吧,flip以后要达到什么要求呢? |
f*****e 发帖数: 2992 | 3 好像是两个binary index tree在一起。
【在 p*****y 的大作中提到】 : 没看懂,应该不是flip一个指定位置的pixel吧,flip以后要达到什么要求呢?
|
w****a 发帖数: 710 | 4 这个让我回忆起了以前做DirectDraw的时光。。。 |
e***s 发帖数: 799 | 5 void filp(int startX, int startY, int endX, int endY){
}
这样一个方法? |
l**b 发帖数: 457 | 6 是
【在 e***s 的大作中提到】 : void filp(int startX, int startY, int endX, int endY){ : } : 这样一个方法?
|
h*********o 发帖数: 230 | 7 这个DFS可以吗?
【在 l**b 的大作中提到】 : 刚刚电面的。东欧人,320 * 200 的screen,只能表示黑白2种颜色。要求你写一个 : flip的function把某个长方形区域里面的pixel由黑变成白或者由白变成黑。 : 小结一下,一开始就说了用bit vector,结果觉得后悔了,应该先用int array的,这 : 样下手会快很多。结果一下子用一个array去表示,想怎么从x,y变成array index想了 : 半天。大脑抽筋了。
|
r******k 发帖数: 46 | 8 为啥我觉得直接a[i][j] = 1 - a[i][j]就好了?
【在 l**b 的大作中提到】 : 刚刚电面的。东欧人,320 * 200 的screen,只能表示黑白2种颜色。要求你写一个 : flip的function把某个长方形区域里面的pixel由黑变成白或者由白变成黑。 : 小结一下,一开始就说了用bit vector,结果觉得后悔了,应该先用int array的,这 : 样下手会快很多。结果一下子用一个array去表示,想怎么从x,y变成array index想了 : 半天。大脑抽筋了。
|
e***s 发帖数: 799 | 9 保证startX < endX; startY < end Y;
然后两层for循环不就完了吗?
是不是我miss something 了? |
h****u 发帖数: 71 | 10 这题用int存pixel有点浪费空间的感觉吧? |
|
|
c********r 发帖数: 286 | 11 大家看看这么写对不对
void flip(int[][]screen, int x,int y){
if(x<0 || x> 320 || y<0 ||y>200) return;
if(screen[y][x] == 0){
screen[y][x] =1; // assuming 0 is black, 1 is white
}
flip(screen, x-1,y) //left
flip(screen, x+1, y) //right
flip(screen, x,y+1) //top
flip(screen, x,y-1) //below
} |
s**********r 发帖数: 8153 | |
n***e 发帖数: 723 | 13 这题肯定是embedded,最好能做in-place的,所以不要用归递,多省点空间。
【在 c********r 的大作中提到】 : 大家看看这么写对不对 : void flip(int[][]screen, int x,int y){ : if(x<0 || x> 320 || y<0 ||y>200) return; : if(screen[y][x] == 0){ : screen[y][x] =1; // assuming 0 is black, 1 is white : } : : flip(screen, x-1,y) //left : flip(screen, x+1, y) //right : flip(screen, x,y+1) //top
|
c********r 发帖数: 286 | 14 怎么个in-place法呢?两个for loop?能否给个code
【在 n***e 的大作中提到】 : 这题肯定是embedded,最好能做in-place的,所以不要用归递,多省点空间。
|
n***e 发帖数: 723 | 15 啊呀,老是不用C,都忘光了,献丑了,要是有问题请指教!
void flip(char* pbuf,int x,int y,int w,int h)
{
int stride = 40;// 320/8 or (width>>3)+(width&0x7)>1;
int i = 0;
int width = w;
pbuf+=y*stride;
while(h--){
width = w;
for(i=x;(width--)>0;i++){
pbuf[i/8]^=1<<(7-i&0x7);
}
pbuf+=stride;
}
}
【在 c********r 的大作中提到】 : 怎么个in-place法呢?两个for loop?能否给个code
|
h**6 发帖数: 4160 | 16 好不容易学的差不多了,在DirectX9里面居然给取消了。
【在 w****a 的大作中提到】 : 这个让我回忆起了以前做DirectDraw的时光。。。
|
c********r 发帖数: 286 | 17 大牛不用C就是用Java写吧。。
【在 n***e 的大作中提到】 : 啊呀,老是不用C,都忘光了,献丑了,要是有问题请指教! : void flip(char* pbuf,int x,int y,int w,int h) : { : int stride = 40;// 320/8 or (width>>3)+(width&0x7)>1; : int i = 0; : int width = w; : pbuf+=y*stride; : while(h--){ : width = w; : for(i=x;(width--)>0;i++){
|
s**********r 发帖数: 8153 | 18 让我想起来做图像。。。!%!¥#@!¥@#¥!@#¥ |
s**********r 发帖数: 8153 | 19 为啥我也这么觉得。。。。
【在 r******k 的大作中提到】 : 为啥我觉得直接a[i][j] = 1 - a[i][j]就好了?
|
s*****n 发帖数: 5488 | 20 好久没写 C了。
byte* flip(byte* screen, int x, int x1,int y, int y1){
byte[40] xfilter ={0};
for (int j = 0 ; j < 320; j ++){
if (j < x || j> x1)
xfilter[j/8] &= ~1<< (j%8);
else
xfilter[j/8] |= 1<< (j%8);
}
for (int i = 0; i < x * y/8; ++){
int line = i/40;
if (line < y || line > y1)
continue;
screen[i] ^= yfilter[i];
}
return screen;
} |