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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章