• 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的队列解决了问题。。

    流转星云
  • 相关阅读:
    【经典数据结构】B树与B+树
    【经典算法】线性时间排序
    【经典算法】归并排序
    【经典算法】快速排序
    python模块之shelve
    python模块之pickle
    python模块之json
    python之序列化
    python模块之shutil和zipfile
    python模块之sys
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12531541.html
Copyright © 2020-2023  润新知