201512-3畫圖
問題描述
試題編號: | 201512-3 |
試題名稱: | 畫圖 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 用 ASCII 字元來畫圖是一件有趣的事情,並形成了一門被稱為 ASCII Art 的藝術。例如,下圖是用 ASCII 字元畫出來的 CSPRO 字樣。 輸入格式 第1行有三個整數m, n和q。m和n分別表示畫布的寬度和高度,以字元為單位。q表示畫圖操作的個數。 畫布的左下角是座標為 (0, 0) 的位置,向右為x座標增大的方向,向上為y座標增大的方向。這q個操作按照資料給出的順序依次執行。畫布最初時所有位置都是字元 .(小數點)。 輸出格式 輸出有n行,每行m個字元,表示依次執行這q個操作後得到的畫圖結果。 樣例輸入 4 2 3 樣例輸出 AAAA 樣例輸入 16 13 9 樣例輸出 ................ 評測用例規模與約定 所有的評測用例滿足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示輸入資料中所有位置的x座標),0 ≤ y < n(y表示輸入資料中所有位置的y座標)。 |
簡單的模擬題,讀懂題意即可,程式碼如下,詳見註釋:
#include<iostream>
using namespace std;
char paint[110][110];
int m,n;
//遞迴填充字元,要對每次遞迴都做好邊界條件判斷
void dfs(int x,int y,char a)
{
paint[x][y]=a;
if(x>0 && paint[x-1][y]!='-' && paint[x-1][y]!='|' && paint[x-1][y]!='+' && paint[x-1][y]!=a)
dfs(x-1,y,a);
if(x<n-1 && paint[x+1][y]!='-' && paint[x+1][y]!='|' && paint[x+1][y]!='+' && paint[x+1][y]!=a)
dfs(x+1,y,a);
if(y>0 && paint[x][y-1]!='-' && paint[x][y-1]!='|' && paint[x][y-1]!='+' && paint[x][y-1]!=a)
dfs(x,y-1,a);
if(y<m-1 && paint[x][y+1]!='-' && paint[x][y+1]!='|' && paint[x][y+1]!='+' && paint[x][y+1]!=a)
dfs(x,y+1,a);
}
int main()
{
int q;
//重點!!m表示寬度,n表示長度,即m表示二維陣列的列,n表示行,所以後面對陣列進行訪問都要將行和列顛倒一下
cin>>m>>n>>q;
//初始化陣列
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
paint[i][j]='.';
while(q--)
{
int op;
//輸入操作型別
cin>>op;
if(op==1)
{
int x,y;
char a;
cin>>x>>y>>a;
dfs(y,x,a);
}
else if(op==0)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(x1==x2)
{
//y1和y2的大小關係不確定,判斷一下
if(y1>y2)
{
int temp=y1;
y1=y2;
y2=temp;
}
for(int i=y1;i<=y2;i++)
{
//重點,要注意到當前位置的字元可能為+,不然這個程式只有90分
if(paint[i][x1]=='-' || paint[i][x1]=='+')
paint[i][x1]='+';
else
paint[i][x1]='|';
}
}
if(y1==y2)
{
//x1和x2的大小關係不確定,判斷一下
if(x1>x2)
{
int temp=x1;
x1=x2;
x2=temp;
}
for(int i=x1;i<=x2;i++)
{
//重點,要注意到當前位置的字元可能為+,不然這個程式只有90分
if(paint[y1][i]=='|' || paint[y1][i]=='+')
paint[y1][i]='+';
else
paint[y1][i]='-';
}
}
}
}
//因為本題規定向上為x軸的正方向,所以要倒著輸出行
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<m;j++)
printf("%c",paint[i][j]);
cout<<endl;
}
return 0;
}