C++实现画图问题(CSP模拟题

看题目:
在这里插入图片描述
在这里插入图片描述
评测用例规模与约定  所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。
在这里插入图片描述

首先看到这道题,我用BFS的算法写的,但是由于某些原因导致bfs只得了60分,
于是改为了dfs后,它成功了。
过程分析:BFS这段代码冗长,而且在while循环中,应该再加一个条件判断,
不然它会从之前判断那些点,走到地图的角落又往回走,这点很不美好。还有一个
更不美好的,数组开太多了,正常情况下,能用单一变量解决的坚决不用数组,因为
容易超出数组范围,所以开数组时,根据实际情况开大点点。

然后是dfs,因为dfs会遍历地图的每个点,直至终点,这恰好符合了我需要
实现填充这一功能,即是从起点出发,把每一个能够到达的点染成和起始点
一样的颜色。
而判断合法的条件就是不撞到边界,不超出范围。针对本题而言,你可以直接
定义一个bool函数判断合法,用它替代if语句中那一大堆,使代码具有可读性

bool judge(){
    if(tx>=0 && ty>=0 && tx<m && ty<n && vis[tx][ty]==0 && 
    asc[tx][ty] != '+' && asc[tx][ty] != '|' && asc[tx][ty] != '-')
    	return true;
    else return false;
}
然后dfs的条件就是if(judge)

首先我们来看看60分的代码,为什么60分我也不知道,WA了?反正这个BFS使人难受:
在这里插入图片描述

#include<iostream>
#include<queue>
#include<math.h>
#include<string.h> 
using namespace std;
int m,n,q;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
//right,up,left,down
int vis[100][100];
char asc[100][100];
int op[100];//actions
int locate[100][4];
char filled[100];
struct point{
 int x,y;
};//asc[i][j] 
queue<point> Q;
void full(int sx,int sy,char tag){
 memset(vis,0,sizeof(vis));
 point start;point to;
 start.x=sx;start.y=sy;
 Q.push(start);
 vis[sx][sy]=1;
 asc[sx][sy]=tag;
 while(!Q.empty()){
  point now=Q.front();
  Q.pop();
  for(int mi=0;mi<4;mi++){
      to.x=now.x+dir[mi][0];
   to.y=now.y+dir[mi][1];
   //suit for
   if(to.x>=0 && to.y>=0 && to.x<=m && to.y<=n && vis[to.x][to.y]==0 &&
   asc[to.x][to.y] != '+' && asc[to.x][to.y] != '-' && asc[to.x][to.y] != '|'){
    asc[to.x][to.y]=tag;
    vis[to.x][to.y]=1;
    Q.push(to);
   }
  } 
 }
}
void wall(int x1,int y1,int x2,int y2){
 if(x1 == x2 && abs(y2-y1) >= 2){
  asc[x1][y1]='+';asc[x2][y2]='+';
  if(y1>y2)
   for(int mj=y2+1;mj<y1;mj++)
       asc[x1][mj]='|';
  if(y2>y1)
      for(int mj=y1+1;mj<y2;mj++)
       asc[x1][mj]='|';
 }
 if(y1==y2 && abs(x1-x2) >= 2 ){
  asc[x1][y1]='+';asc[x2][y2]='+';
  if(x2>x1)
   for(int mj=x1+1;mj<x2;mj++)
    asc[mj][y1]='-';
  if(x1>x2)
   for(int mj=x2+1;mj<x1;mj++)
    asc[mj][y1]='-';
 }
 if(x1==x2 && abs(y2-y1)<2){
  asc[x1][y1]='|';asc[x2][y2]='|';
 }
 if(y1==y2 && abs(x1-x2)<2){
  asc[x1][y1]='-';asc[x2][y2]='-';
 }
}
void draw(){
 for(int i=0;i<q;i++){
  cin>>op[i];
  if(op[i]==1){//filled
   cin>>locate[i][0]>>locate[i][1];
   cin>>filled[i];
   full(locate[i][0],locate[i][1],filled[i]);  
  }
  else{
   cin>>locate[i][0]>>locate[i][1]>>locate[i][2]>>locate[i][3];
   //x1,y1  x2,y2
   wall(locate[i][0],locate[i][1],locate[i][2],locate[i][3]);  
  }   
 }
}
int main(){
 //memset(vis,0,sizeof(vis));
 //initialize
 cin>>m>>n>>q;
 for(int i=n-1;i>=0;i--)
  for(int j=0;j<m;j++)
   asc[j][i]='.';
 draw();
 for(int i=n-1;i>=0;i--){
  for(int j=0;j<m;j++)
   cout<<asc[j][i];
  cout<<endl;
 }
  
 return 0; 
} 

我先把测试数据放上来

输入:
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C

输出:

................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................

输入

4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A

输出:

AAAA
A--A

输入:

100 100 15
0 1 1 98 1
0 98 1 98 98
0 98 98 1 98
0 1 98 1 1
0 5 5 94 5
0 94 5 94 94
0 94 94 5 94
0 5 94 5 5
0 37 37 62 37
0 62 37 62 62
0 62 62 37 62
0 37 62 37 37
1 40 41 *
1 2 2 S
1 6 6 ?

输出:

....................................................................................................
.+------------------------------------------------------------------------------------------------+.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSS+----------------------------------------------------------------------------------------+SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|???????????????????????????????+------------------------+???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????|************************|???????????????????????????????|SSS|.
.|SSS|???????????????????????????????+------------------------+???????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS|????????????????????????????????????????????????????????????????????????????????????????|SSS|.
.|SSS+----------------------------------------------------------------------------------------+SSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.|SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS|.
.+------------------------------------------------------------------------------------------------+.
....................................................................................................

思考,到底哪里出错了呢?是不是超时了呢?
伤悲悲伤。可能是我填充函数复杂度的问题,下面我尝试用DFS写一份代码,阔怕。DFS神奇地过了,开心
在这里插入图片描述

#include<iostream>
#include<stdio.h>
#include<math.h> 
#include<string.h>
using namespace std;
int m,n,q,op,x,y,xx,yy;
char ful;
int vis[101][101];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char asc[101][101];
void dfs(int sx,int sy,char tag){
 vis[sx][sy]=1;
 asc[sx][sy]=tag;
 for(int mi=0;mi<4;mi++){
  int tx=sx+dx[mi];
  int ty=sy+dy[mi];
  if(tx>=0 && ty>=0 && tx<m && ty<n && vis[tx][ty]==0 && asc[tx][ty] != '+' && asc[tx][ty] != '|' && asc[tx][ty] != '-')
   dfs(tx,ty,tag);
 }
}
void swap(int *xxx,int *yyy){
 int temp=*xxx;
 *xxx=*yyy;
 *yyy=temp;
}
void draw(){
 
 for(int hi=0;hi<q;hi++){
  scanf("%d",&op);
  if(op==1){
   scanf("%d %d %c",&x,&y,&ful);
   memset(vis,0,sizeof(vis));
   dfs(x,y,ful);
  }
  else if(op==0){
   scanf("%d %d %d %d",&x,&y,&xx,&yy);
   if(x==xx){
    if(y>yy)  swap(y,yy);
    for(int j=y;j<=yy;j++){
     if(asc[x][j]=='-' || asc[x][j]=='+')
      asc[x][j]='+';
     else asc[x][j]='|';
    }
   }
   else if(y==yy){
    if(x>xx) swap(x,xx);
    for(int j=x;j<=xx;j++){
     if(asc[j][y]=='|' || asc[j][y]=='+')
      asc[j][y]='+';
     else asc[j][y]='-';
    }
   }
  } 
 }
}
int main(){
 scanf("%d %d %d",&m,&n,&q);
 for(int i=n-1;i>=0;i--)
  for(int j=0;j<m;j++)
   asc[j][i]='.';
   
 draw();
 for(int i=n-1;i>=0;i--){
  for(int j=0;j<m;j++)
   cout<<asc[j][i];
  if(i!=0)
      cout<<endl;
 } 
 return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值