问题描述
试题编号: | 201512-3 |
试题名称: | 画图 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
|
评测用例规模与约定
所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的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的队列解决了问题。。