CSP-201512-3画图

问题描述

试题编号: 201512-3
试题名称: 画图
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
 

 

评测用例规模与约定
  所有的评测用例满足:2 ≤ mn ≤ 100,0 ≤ q ≤ 100,0 ≤ x < mx表示输入数据中所有位置的x坐标),0 ≤ y < ny表示输入数据中所有位置的y坐标)。

分析:

本道题目是一道模拟类的题目,同时涉及到搜索的问题。

解题思路:

1.数据结构:

所有的信息可以存储到n*m的二维数组里面,不过要注意数组和模拟图之间的对应关系!

2.算法:

深度搜索dfs或者广度搜索bfs均可

本题涉及到的两个基本操作,画直线和填充字母。

首先搞清楚我们开的数组和地图之间坐标的对应关系:

                     (x, y)<==>   (n-1-y, x)

画线的操作基本上就解决了,只需要根据某个不变的坐标,对另一个坐标从小到大遍历即可。

然后就是填充字母操作:根据给定起点,遍历图搜索标记即可。值得注意的是判断条件不一定只有'.'就填充,可能之前有填充其他字母,存在覆盖的情况。

条件判断:1.地图/数组 边界  2.障碍 ‘-’‘+’‘|’ (只要不是这三个都可以填充) 3.  已标记 mp[i][j]=c

  1 #include<iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<queue>
  5 #include<cmath> 
  6 using namespace std;
  7 struct node{           
  8     int x,y;
  9     node(int _x,int _y): x(x),y(y) {};
 10 //    bool operator =(node n){
 11 //        this->x = n.x;
 12 //        this->y = n.y;
 13 //        return true;
 14 //    }
 15 }; 
 16 
 17 int m,n,q;  //宽、高、操作数
 18 int dx[] ={1,0,0,-1};
 19 int dy[] ={0,1,-1,0}; 
 20 char mp[101][101];
 21 bool check(int x,int y,char c){
 22     if(x<0 || y<0|| x==n||y==m
 23     ||mp[x][y]==c
 24     ||mp[x][y]=='+'||mp[x][y]=='|'||mp[x][y]=='-')
 25         return false;
 26     else
 27         return true;    
 28 }
 29 void dfs(int x,int y, char c){
 30     if(x<0||x>=n||y<0||y>=m||mp[x][y]==c||mp[x][y]=='-'||mp[x][y]=='|'||mp[x][y]=='+')
 31     return;
 32     mp[x][y]=c;
 33     for(int i=0;i<4;i++)
 34     dfs(x+dx[i],y+dy[i],c);
 35 }
 36 void bfs(int x,int y,char c){
 37     //判断边界(好像不需要 
 38     //if(x==m||y==n||mp[x][y]=='.'||mp[x][y]=='+'||mp=='|'||mp[x][y]=='-')
 39     //return;
 40     mp[x][y]=c;
 41 //    queue<node> q;
 42 //    node source(x,y);
 43 //    q.push(source);    
 44     queue<int> p,q;
 45     p.push(x);
 46     q.push(y); 
 47 //    cout<<"(x,y): ("<<x<<", "<<y<<")"<<endl; 
 48     while(!q.empty()){
 49     //    node now=q.front();q.pop();                            
 50         int now_x = p.front();
 51         int now_y = q.front();
 52         p.pop();q.pop();
 53         //cout<<"now:("<<now.x<<", "<<now.y<<")"<<endl;
 54         //cout<<"now: ("<<now_x<<", "<<now_y<<")"<<endl;
 55         for(int i=0;i<4;i++){
 56 //            int ax=now.x+dx[i];
 57 //            int ay=now.y+dy[i];
 58 
 59             int ax=now_x+dx[i];
 60             int ay=now_y+dy[i];
 61             if(check(ax,ay,c))
 62             //if(ax==m||ay==n||mp[ax][ay]==c||mp[ax][ay]=='|'||mp[ax][ay]=='-'||mp[ax][ay]=='+')
 63             //if(ax>=0&&ax<n&&ay>=0&&ay<m&&mp[ax][ay]=='.')
 64             {
 65             //node add(ax,ay);            
 66             //q.push(add);
 67             p.push(ax);q.push(ay);
 68             mp[ax][ay]=c;
 69             }
 70         }                
 71     }
 72     return ;
 73 }
 74 int main(){
 75     
 76     //0 x1,y1,x2,y2  线段  横纵坐标有且仅有一个相等 
 77     //1 x y c  填充字母
 78     //初始化“.” 
 79     cin>>m>>n>>q;
 80     //char mp[m][n];
 81     memset(mp,'.',sizeof(mp));//初始化 
 82     while(q--){
 83         int op;
 84         cin>>op;
 85         if(op==0){
 86             int x1,x2,y1,y2;
 87             cin>>x1>>y1>>x2>>y2;
 88             if(x1==x2){
 89                     for(int i=min(n-1-y1,n-1-y2);i<=max(n-1-y1,n-1-y2);i++){
 90                         if(mp[i][x1] != '-' && mp[i][x1]!='+')
 91                         mp[i][x1]='|';
 92                         else
 93                         mp[i][x1]='+';
 94                     }    
 95             }
 96             else {
 97                 for(int i=min(x1,x2);i<=max(x1,x2);i++){
 98                         if(mp[n-1-y1][i]!='|'&&mp[n-1-y1][i]!='+')
 99                         mp[n-1-y1][i]='-';
100                         else
101                         mp[n-1-y1][i]='+';
102                     }    
103             }
104         }
105         else{
106             int x,y;char c;
107             //cin>>x>>y;
108             //cin>>c;
109             scanf("%d%d %c",&x,&y,&c);
110             //bfs(n-1-y,x,c);
111             dfs(n-1-y,x,c);
112         }         
113     }    
114     for(int j=0;j<n;j++)
115      {
116       for(int i=0;i<m;i++)
117         cout<<mp[j][i];       
118       cout<<endl;
119     } 
120     return 0;
121 }

本道题目遇到的问题:

结构体队列 queue<node> q;q.push();q.pop();   似乎无法push进去,输出的都为零?

最后还是写成两个int的队列解决了问题。。

流转星云
原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12531541.html