问题描述
试题编号: | 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的队列解决了问题。。