http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110105&format=html

UVA 10267 Graphical Editor(图形化编辑器)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=29&page=show_problem&problem=1208

题目大意:

根据指令进行操作:

I M N          创建一个新的M*N图像,所有像素为白色(O)

C               清楚图像,把所有像素涂成白色(O),图像大小不变

L X Y C          把像素(X,Y)涂成颜色(C)

V X Y1 Y2 C     画一条竖直线段,颜色为(C),列号为X,从第Y1行到第Y2行(包括Y1和Y2行)

H X1 X2 Y C     画一条水平线段,颜色为(C),行号为Y,从第X1列到地X2列(包括X1和X2列)

K X1 Y1 X2 Y2 C      画一个实心矩形,颜色为(C),左上角为(X1,Y1),右下角为(X2,Y2)

F X Y C       把区域R填充为颜色(C)。R的定义为:若像素(X,Y)属于R,则所有与(X,Y)公共边且颜色相同的像素也属于R

S NAME        原样输出文件名以及整幅图像的像素矩阵

X          退出程序

输入,参见样例

note:如果指令的第一个字符不是I、C、L、V、H、K、F、S、X之一,忽略此指令,直接跳到下一行

 样例输入:

I 5 6
L 2 3 A
S one.bmp
G 2 3 J
F 3 3 J
V 2 3 4 W
H 3 4 2 Z
S two.bmp
X
样例输出:
one.bmp
OOOOO
OOOOO
OAOOO
OOOOO
OOOOO
OOOOO
two.bmp
JJJJJ
JJZZJ
JWJJJ
JWJJJ
JJJJJ
JJJJJ
此题让我纠结了好长时间,主要原因我觉得还是在输入输出上的问题,跟队友交了n次都没过,郁闷至极啊,不过最终还是解决了,贴一下队友的代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char bmp[255][255];
char name[255];
int row,col,b[4][2]={-1,0,1,0,0,-1,0,1};
int fill_field(int x,int y,char cur,char rec)//填充R区域
{
int i,s,t;
if(bmp[x][y]==cur) return 0;
bmp[x][y]=cur;
for(i=0;i<4;i++)
{
s=b[i][0]+x;
t=b[i][1]+y;
if(s>0 && s<=row && t>0 && t<=col && bmp[s][t]==rec)
fill_field(s,t,cur,rec);
}
return 0;
}
int fill_bmp(int u,int d,int l,int r,char c) //填充指定区域
{
int i,j;
for(i=u;i<=d;i++)
for(j=l;j<=r;j++) bmp[i][j]=c;
return 0;
}
int main()
{
int i,j,x1,y1,x2,y2,x,y,temp;
char type,c;
while(1)
{
cin>>type;
if(type=='X') break; //退出程序
switch(type)
{
case 'I': //创建一个新的M*N图像,所有像素为白色(O)
cin>>col>>row;
fill_bmp(1,row,1,col,'O');
break;
case 'C': //清楚图像,把所有像素涂成白色(O),图像大小不变
fill_bmp(1,row,1,col,'O');
break;
case 'L': // 把像素(X,Y)涂成颜色(C)
cin>>y>>x>>c;
fill_bmp(x,x,y,y,c);
break;
case 'V': //画一条竖直线段,颜色为(C),列号为X,从第Y1行到第Y2行(包括Y1和Y2行)
cin>>y1>>x1>>x2>>c;
if(x1>x2) temp=x1,x1=x2,x2=temp;
fill_bmp(x1,x2,y1,y1,c);
break;
case 'H': //画一条水平线段,颜色为(C),行号为Y,从第X1列到地X2列(包括X1和X2列)
cin>>y1>>y2>>x1>>c;
if(y1>y2) temp=y1,y1=y2,y2=temp;
fill_bmp(x1,x1,y1,y2,c);
break;
case 'K': //画一个实心矩形,颜色为(C),左上角为(X1,Y1),右下角为(X2,Y2)
cin>>y1>>x1>>y2>>x2>>c;
fill_bmp(x1,x2,y1,y2,c);
break;
case 'F': //把区域R填充为颜色(C)。R的定义为:若像素(X,Y)属于R,则所有与(X,Y)公共边且颜色相同的像素也属于R
cin>>y>>x>>c;
fill_field(x,y,c,bmp[x][y]);
break;
case 'S': //原样输出文件名以及整幅图像的像素矩阵
cin>>name;
cout<<name<<endl;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++) cout<<bmp[i][j];
cout<<endl;
}
break;
default: //处理非指令信息
while(getchar()!='\n');
break;
}
}
return 0;
}


posted on 2012-03-02 09:24  pcoda  阅读(568)  评论(0编辑  收藏  举报