CSP月模拟练习 201512-3 画图

CSP月模拟练习 201512-3 画图

题目:画图

题目附
Input&&Output:
INPUT&&OUTPUT
sample:

#input:
4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A
#output:
AAAA
A--A

#input:
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
#output:
................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................

题解:

1.这道题粗略以看还是很容易想到思路的显然是一道图的遍历问题
2.然后我们仔细品一品,首先这个画图分两部分一部分是直线,另一部分是填充(dfs 扩充 专业一点叫dfs的四邻域填充)
3.最后就是画图时的节点填充的更新,我们分两种情况:
一种是字母的填充填充边界有两种一种是矩阵边界另一种是特殊符号 ‘-’,‘|’,‘+’(可以理解为墙)
另一种是线段的画法 此时应该注意 | - 相交变 + 而加号是最高级永远不会被替代
4.然后我们仔细观察会发现它给的矩阵实际上与我们建立的矩阵不同,因此我们可以作一个映射(直接给出我计算的映射关系 [i,j]-->[n-j-1,i])
5.最后注意输出的格式(比如我憨憨的多输了无数的空格 然后炸裂了一会)

C++代码:

#include<iostream>

using namespace std;
const int maxn=1e4+500;
char frame_buf[maxn][maxn];
int m,n,q;
bool mark[maxn][maxn];
int dx[] = {0,1,-1,0};
int dy[] = {1,0,0,-1};
void init(){
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			frame_buf[i][j]='.';
}
void mark_init(){
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			mark[i][j]=false;
}
void cha(int i,int j,char new_ele){
	if((frame_buf[i][j]=='-'&&new_ele=='|')||(frame_buf[i][j]=='|'&&new_ele=='-'))
		frame_buf[i][j]='+';
	else if(frame_buf[i][j]!='-'&&frame_buf[i][j]!='|'&&frame_buf[i][j]!='+')
		frame_buf[i][j]=new_ele;
}

void dfs(int x1,int y1,char c){
	if(!mark[x1][y1]){
		mark[x1][y1]=true;
		if(x1<0||x1>=n||y1<0||y1>=m||frame_buf[x1][y1]=='|'||frame_buf[x1][y1]=='-'||frame_buf[x1][y1]=='+')//不合法  m列 n行 
			return;
		cha(x1,y1,c);
		for(int i=0;i<4;i++)
			dfs(x1+dx[i],y1+dy[i],c);
	}
}

void line(int x1,int y1,int x2,int y2){//画线 
	if(x1==x2){
		if(y1>y2) swap(y1,y2);
		for(int i=y1;i<=y2;i++)
			cha(x1,i,'-');
	}
	else{
		if(x1>x2) swap(x1,x2);
		for(int i=x1;i<=x2;i++)
			cha(i,y1,'|');
	}
}

void out(){
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++)
			cout<<frame_buf[i][j];
		if(i+1!=n) cout<<endl;
	}	
}
int main(){
	cin>>m>>n>>q;
	int jud,x1,x2,y1,y2;
	char c;
	init();
	while(q--){
		cin>>jud;
		if(jud==0){
			cin>>x1>>y1>>x2>>y2;//映射关系 i,j-->n-j-1,i
			line(n-y1-1,x1,n-y2-1,x2);
		}
		else{
			mark_init();
			cin>>x1>>y1>>c;
			dfs(n-y1-1,x1,c);
		}
	}
	out();
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章