回答編集履歴
2
追記
test
CHANGED
@@ -28,3 +28,45 @@
|
|
28
28
|
return 0;
|
29
29
|
}
|
30
30
|
```
|
31
|
+
|
32
|
+
---
|
33
|
+
|
34
|
+
何やら人気の課題なのかもしれないし(?) 念のため最も話的に愚直だと思う実装を書いておく.
|
35
|
+
(呼び出し側の main 関数のところは↑と同一なので省略)
|
36
|
+
|
37
|
+
```C
|
38
|
+
//2種類の文字を交互に出力したいなら,どっちを出力するか?を毎回切り替えればいいよねっていう.
|
39
|
+
void F( int n )
|
40
|
+
{
|
41
|
+
//次に出力する行の先頭で出力すべき文字
|
42
|
+
char FirstOutputChar_for_NextLine = '+'; //最初の行は'+'だよね.
|
43
|
+
|
44
|
+
for( int y=0; y<n; ++y ) //n行分のループ
|
45
|
+
{
|
46
|
+
//この行内で次に出力すべき文字.
|
47
|
+
char OutputChar = FirstOutputChar_for_NextLine;
|
48
|
+
|
49
|
+
for( int x=0; x<n; ++x ) //現在の行のn文字についてループ
|
50
|
+
{
|
51
|
+
//現在出力すべき文字を出力する
|
52
|
+
putchar( OutputChar );
|
53
|
+
|
54
|
+
//「この行内で次に出力すべき文字」を更新する
|
55
|
+
//今 '+' を出力したなら次は '-' にすればいいし,
|
56
|
+
//そうでないなら次は '+' にすればいい.
|
57
|
+
if( OutputChar=='+' )
|
58
|
+
{ OutputChar = '-'; }
|
59
|
+
else
|
60
|
+
{ OutputChar = '+'; }
|
61
|
+
}
|
62
|
+
putchar( '\n' ); //行末で改行
|
63
|
+
|
64
|
+
//(行内の話と同様に)
|
65
|
+
//「次の行の先頭で表示すべき文字」も更新する.
|
66
|
+
if( FirstOutputChar_for_NextLine=='+' )
|
67
|
+
{ FirstOutputChar_for_NextLine = '-'; }
|
68
|
+
else
|
69
|
+
{ FirstOutputChar_for_NextLine = '+'; }
|
70
|
+
}
|
71
|
+
}
|
72
|
+
```
|
1
説明を書く.
test
CHANGED
@@ -1,4 +1,8 @@
|
|
1
|
+
`f(x,y) = cos(x)*sin(y)` のグラフを眺めてみると,出力したい物と非常によく似ていることに気づくでしょう.
|
2
|
+
すなわち,(グラフをちょろっと伸縮&オフセットすれば)`f(x,y)` の値の符号を用いて `+`, `-` のどちらを出力すれば良いのかを判断できそうです.
|
3
|
+
↓
|
4
|
+
方法論を用意できたので,あとはそれを実装するだけです.
|
1
|
-
|
5
|
+
以下のコードはこの話を愚直に書きました.
|
2
6
|
|
3
7
|
```C
|
4
8
|
void F( int n )
|