题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1208
题目意思:
给一连串命令,对矩阵进行操作。
解题思路:
注意画横线和竖线时,题目只说在两端点之间,因此要判断大小。
填充矩形时注意坐标端点大小比较。
创建图形时注意行和列的位置,哪在前哪在后。
找出某点的关联点用DFS。
总结:不要想当然的认为满足一定的条件,坐标大小顺序。注意DFS的简洁高效。
代码:
#include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<map> #define eps 1e-6 #define INF (1<<20) #define PI acos(-1.0) using namespace std; char mapp[260][260]; //map定义为全局变量时有冲突 int flag[260][260]; int col,row; bool judge(int x,int y) { if(x>=1&&x<=row&&y>=1&&y<=col) return true; return false; } void dfs(int x,int y,char temp,char stan) { //printf("%c %d %d\n",temp,col,row);wz mapp[x][y]=stan; flag[x][y]=1; //上下左右四个方向的更新 if(judge(x,y-1)&&mapp[x][y-1]==temp&&flag[x][y-1]==0) dfs(x,y-1,temp,stan); if(judge(x,y+1)&&(mapp[x][y+1]==temp)&&flag[x][y+1]==0) dfs(x,y+1,temp,stan); if(judge(x-1,y)&&mapp[x-1][y]==temp&&flag[x-1][y]==0) dfs(x-1,y,temp,stan); if(judge(x+1,y)&&mapp[x+1][y]==temp&&flag[x+1][y]==0) dfs(x+1,y,temp,stan); return ; } int main() { char order[3],temp[3]; while(scanf("%s",order)!=EOF) { if(*order=='X') break; switch(*order) { case 'I':scanf("%d%d",&col,&row); //注意不要把这写反 for(int i=1;i<=row;i++) for(int j=1;j<=col;j++) mapp[i][j]='O'; break; case 'C':for(int i=1;i<=row;i++) for(int j=1;j<=col;j++) mapp[i][j]='O'; break; case 'L':int a,b; scanf("%d%d%s",&a,&b,temp); mapp[b][a]=*temp; break; case 'V':int tempcol,startrow,endrow; scanf("%d%d%d%s",&tempcol,&startrow,&endrow,temp); if(startrow>endrow) swap(startrow,endrow); //题目只是说两行之间 for(int i=startrow;i<=endrow;i++) mapp[i][tempcol]=*temp; break; case 'H':int startcol,endcol,temprow; scanf("%d%d%d%s",&startcol,&endcol,&temprow,temp); if(startcol>endcol) swap(startcol,endcol); for(int i=startcol;i<=endcol;i++) mapp[temprow][i]=*temp; break; case 'K':int leupx,leupy,ridox,ridoy; scanf("%d%d%d%d%s",&leupy,&leupx,&ridoy,&ridox,temp); if(leupx>ridox) swap(leupx,ridox); if(leupy>ridoy) swap(leupy,ridoy); for(int i=leupx;i<=ridox;i++) for(int j=leupy;j<=ridoy;j++) mapp[i][j]=*temp; break; case 'F':int x,y; scanf("%d%d%s",&y,&x,temp); memset(flag,0,sizeof(flag)); dfs(x,y,mapp[x][y],*temp); break; case 'S':char name[1000]; scanf("%s",name); printf("%s\n",name); for(int i=1;i<=row;i++) { mapp[i][col+1]='\0'; printf("%s\n",mapp[i]+1); } break; default :char atemp[10000]; gets(atemp); //略去不是命令的 } } return 0; }