1. 程式人生 > >CCF 201512-3 畫圖

CCF 201512-3 畫圖

題目

問題描述

  用 ASCII 字元來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字元畫出來的 CSPRO 字樣。
  ..____.____..____..____...___..
  ./.___/.___||.._.\|.._.\./._.\.
  |.|...\___.\|.|_).|.|_).|.|.|.|
  |.|___.___).|..__/|.._.<|.|_|.|
  .\____|____/|_|...|_|.\_\\___/.
  本題要求程式設計實現一個用 ASCII 字元來畫圖的程式,支援以下兩種操作:
   畫線:給出兩個端點的座標,畫一條連線這兩個端點的線段。簡便起見題目保證要畫的每條線段都是水平或者豎直的。水平線段用字元 - 來畫,豎直線段用字元 | 來畫。如果一條水平線段和一條豎直線段在某個位置相交,則相交位置用字元 + 代替。
   填充:給出填充的起始位置座標和需要填充的字元,從起始位置開始,用該字元填充相鄰位置,直到遇到畫布邊緣或已經畫好的線段。注意這裡的相鄰位置只需要考慮上下左右 4 個方向,如下圖所示,字元 @ 只和 4 個字元 * 相鄰。
  .*.
  *@*
  .*.

輸入格式

  第1行有三個整數m, nqmn分別表示畫布的寬度和高度,以字元為單位。q表示畫圖操作的個數。
  第2行至第q + 1行,每行是以下兩種形式之一:
   0 x1 y1 x2 y2:表示畫線段的操作,(x1, y1)和(x2, y2)分別是線段的兩端,滿足要麼x1 = x2 且y1 ≠ y2,要麼 y1 = y2 且 x1 ≠ x2。
   1 x y c:表示填充操作,(x, y)是起始位置,保證不會落在任何已有的線段上;c 為填充字元,是大小寫字母。
  畫布的左下角是座標為 (0, 0) 的位置,向右為x座標增大的方向,向上為y座標增大的方向。這q個操作按照資料給出的順序依次執行。畫布最初時所有位置都是字元 .(小數點)。

輸出格式

  輸出有n行,每行m個字元,表示依次執行這q個操作後得到的畫圖結果。

樣例輸入

4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A

樣例輸出

AAAA
A--A

樣例輸入

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

樣例輸出

................
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................

評測用例規模與約定

  所有的評測用例滿足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < mx表示輸入資料中所有位置的x座標),0 ≤ y < ny表示輸入資料中所有位置的y座標)。

問題分析

這道題是道模擬題,感覺比之前做的要容易一些,可能是因為條理更容易理清吧。

首先注意題目中“這q個操作按照資料給出的順序依次執行”,這表明了我們在每輸入一行指令後就要處理一次。

畫線比較容易,注意好自己座標的方向就行,這裡我採用的座標軸橫軸方向與題目一致,縱軸方向與題目相反,因為這對陣列來說是自然的並且處理起來更清楚一些,雖然縱軸方向與題目相反,但並無大礙,只需在輸出的時候逆著輸出即可。

填充經過題目的描述很顯然使用DFS進行,當然使用BFS也可以。

最後比較容易漏掉的一點是:當某一位置已經是‘+’時,若畫線時又經過此位置,則不能將此位置的‘+’改為‘-’或‘|’(程式碼中有註釋提醒),忽略了這一點只能拿90分= =。

程式碼中註釋掉的部分用來輸出每一步後圖的變化情況。便於debug,但題目中不需要。

程式碼

#include<cstdio>
#include<cstring>
#include<algorithm> 
using namespace std;
const int MAX_SIZE = 100;

char G[MAX_SIZE][MAX_SIZE];
bool ban[MAX_SIZE][MAX_SIZE] = {false};//線上的點 
bool visited[MAX_SIZE][MAX_SIZE];
int n,m;
const int move[][2] = {{1,0},{0,1},{-1,0},{0,-1}};//4個方向 

bool IsLegal(int x,int y){
	if(x<0||x>=m||y<0||y>=n)
		return false;
	return true;
}

void fill(int x,int y,char c){
	if(IsLegal(x,y) && !visited[y][x] && !ban[y][x]){
		visited[y][x] = true;
		G[y][x] = c;
		for(int i=0;i<4;i++)
			fill(x+move[i][0],y+move[i][1],c);
	}
}

int main(){
	int q,order,xfrom,xto,yfrom,yto,x,y,i,j,small,big;
	char c;
//	int k,l;
	scanf("%d %d %d",&m,&n,&q);
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
			G[i][j] = '.';
	
	for(i=0;i<q;i++){
		scanf("%d",&order);
		if(order==0){//畫線 
			scanf("%d %d %d %d",&xfrom,&yfrom,&xto,&yto);
			if(xfrom==xto){//'|'
				small = min(yfrom,yto);
				big = max(yfrom,yto);
				for(j=small;j<=big;j++){
					ban[j][xfrom] = true;
					if(G[j][xfrom]!='-'&&G[j][xfrom]!='+')//不要忘記後1個條件 
						G[j][xfrom] = '|';
					else
						G[j][xfrom] = '+';
				}
			}
			else{//'-'
				small = min(xfrom,xto);
				big = max(xfrom,xto);
				for(j=small;j<=big;j++){
					ban[yfrom][j] = true;
					if(G[yfrom][j]!='|'&&G[yfrom][j]!='+')//不要忘記後1個條件 
						G[yfrom][j] = '-';
					else
						G[yfrom][j] = '+';
				}
			}
//			printf("After line:\n");
//			for(k=n-1;k>=0;k--){
//				for(l=0;l<m-1;l++)
//					printf("%c",G[k][l]);
//				printf("%c\n",G[k][l]);
//			}
		}
		else{//填充 
			memset(visited,false,sizeof(visited));
			scanf("%d %d %c",&x,&y,&c);
			fill(x,y,c);
//			printf("after fill:\n"); 
//			for(k=n-1;k>=0;k--){
//				for(l=0;l<m-1;l++)
//					printf("%c",G[k][l]);
//				printf("%c\n",G[k][l]);
//			}
		}
	}
//	printf("\nresult:\n");
	for(i=n-1;i>=0;i--){
		for(j=0;j<m-1;j++)
			printf("%c",G[i][j]);
		printf("%c\n",G[i][j]);
	}
	
	return 0;
}

相關推薦

CCF-201512-3-畫圖

這題搞字元藝術,模擬平時畫圖那樣畫線然後填充顏色。垂直線與水平線相交點變‘+’加號,填充用廣搜,用深搜也行,不過最後一個用例會爆棧,導致執行出錯。廣搜我自己測試100*100的矩陣,然後廣搜100遍都很快,不用一秒出結果,但是提交上去只有90,最後一個用例執行超時。。。很迷。 pyt

ccf 201512-3 畫圖

畫線和填充操作,注意兩線相加變+ #include<iostream> using namespace std; char all[101][101];//x,y int m, n, q;

CCF 201512-3 畫圖

題目 問題描述   用 ASCII 字元來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字元畫出來的 CSPRO 字樣。   ..____.____..____..____...___..   ./.___/.___||

CCF Python題解(90分)201512-3 畫圖

CCF Python題解(90分)201512-3 畫圖 m, n, q = map(int, input().split()) canvas = [['.'] * m for i in range(n)] emoj = ['-', '|', '+'] def fill(x, y,

CCF CFP 201512-3畫圖 JAVA

問題描述   用 ASCII 字元來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字元畫出來的 CSPRO 字樣。   ….………_…   ././.||….|……/.…   |.|…_.|.|).|.|).|

ccf真題-201512-3-畫圖AC題解

1.題目:畫圖-題目 2.輸入輸出: 輸入:第一行-寬度、高度、運算元 在每個操作中:① 0 起止座標 ② 1 起始座標 填充字元 輸出:依次執行操作後的畫圖結果 3.題目分析:看起來題目很花,但是隻要把每個部分拆開來卡就好了,輸入輸出以及陣列的初始化成小數點,很簡

201512-3畫圖

問題描述 試題編號: 201512-3 試題名稱: 畫圖 時間限制: 1.0s 記憶體限制: 256.0MB 問題描述:

201512-3 畫圖

我覺得這道題有兩個難點吧, 1、座標轉化,原始座標(i,j),真實座標應該轉換為(rows - j - 1, i) 2、填充操作,使用遞迴填充,遞迴出口條件時下標越界或者遇到邊界或者該位置已被填充,三個出口條件缺一不可 奉上java滿分程式碼 import java.util.*;

ccf csp 2015-12-3 畫圖

問題描述   用 ASCII 字元來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字元畫出來的 CSPRO 字樣。   ..____.____..____..____...___..   ./.___/.___||..

CCF-201509-3-模板生成系統

gravity return 出現次數 系統 ict 問題 分享 文本 style CCF 試題編號: 201509-3 試題名稱: 模板生成系統 時間限制: 1.0s 內存限制: 256.0MB 問題描述: 問題描述   成成最近在搭建一個網站,

CCF 201312-3 最大的矩形

數量 pac bsp 輸出 span push str wid stream 試題編號: 201312-3 試題名稱: 最大的矩形 時間限制: 1.0s 內存限制: 256.0MB 問題描述: 問題描述   在橫軸上放了n個相鄰的矩形,每個矩形的寬

CCF 201703-3 Markdown

http 相互 打印 turn strong 標記語言 push span eal 試題編號: 201703-3 試題名稱: Markdown 時間限制: 1.0s 內存限制: 256.0MB 問題描述: 問題描述   Markdown 是一種

ccf 201709-3 JSON查詢

length 代碼 tor mage 一位數 技術分享 str 需要 iter ccf 201709-3 JSON查詢 解題思路:   首先,先逐行讀入n行數據,因為數據中會經常出現 空格 或者是 換行,所以,我們遇到空格和換行就忽略,同時將轉義字符進行處理,將n行數據存

ccf 201604-3 路徑解析

img nbsp cout ase main align -a sin 目錄 ccf 201604-3 路徑解析 string.find() 返回字符串s1在s中第一次出現的位置,如果沒有找到,則返回-1 string.erase() erase函數的原型如下:(1)s

【DFS】CCF201512-3畫圖

iomanip 開始 mes shu const using 端點 top DC 問題描述   用 ASCII 字符來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字符畫出來的 CSPRO 字樣。  ..____.____

ccf 201409-3 字符串匹配(toupper,tolower)

cout 分享 type style 串匹配 clu 寫敏感 string 字母 ccf 201409-3 字符串匹配(toupper,tolower) 問題描述   給出一個字符串和多行文字,在這些文字中找到字符串出現的那些行。你的程序還需支持大小寫敏感選項:當選項打開

CCF 201312-3 最大的矩形[比較簡單]

vector 輸出格式 data 空格 輸入格式 out rec 6.0 eight 問題描述 試題編號: 201312-3 試題名稱: 最大的矩形 時間限制: 1.0s 內存限制: 256.0MB 問題描述: 問題描述   在橫軸上放了n個相鄰的

CCF-201803-3-URL映射(模擬)

== 如果 tin 先後 hello i++ 進行 col ima Problem CCF-201803-3-URL映射 Time Limit: 1000 mSec Problem Description URL 映射是諸如 Django、Ruby on Rails

CCF-CSP201609-3 爐石傳說(70分)

#include<iostream> #include<vector> #include<algorithm> using namespace std; struct man { int id; int attack; int life; }; bool c

CCF-201412-3-集合競價

這道題不算是模擬,算數學題吧。這道題也是要細心。 思路 定的開盤價要使得買單和賣單的成交量最大就是儘可能多的把買單和買單進行匹配。成交量就是買單數和賣單數的最小值。 如圖 從buy買價開始找開盤價,每一個開盤價,從開盤價往上求出總買單數,往下找出總賣單數,找買賣單