2012年4月24日星期二

アルゴリズム的な問題です

アルゴリズム的な問題です

あるC言語のプログラムを作ろうとしているのですが、汎用的なアルゴリズムが思いつかず困っています。

プログラムは以下のような内容です。添付の画像を見て頂きたいです。

(1)引数として、以下の3つを渡す。

-一辺の長さ

-縦軸のブロックの個数

-横軸のブロックの個数

(2)プログラム中で、x, yを渡すとその座標がどのブロックに属するかを決定する。



添付の画像は、一辺を10、mを4、nを3とした場合です。

4×3=計12個(0~11)のブロックが(仮想的に)出来上がります。

一辺が10なので、例えば右上の端は(10,10)になりますし、左下の端は(-10,-10)になります。



ここで、プログラム内で例えば

x=1、 y=2を渡すと4を返す

x=5、 y=-1を渡すと8を返す

x=-3、y=7を渡すと1を返す

x=-10、y=-10を渡すと9を返す

ような関数(int foo(int x, int y))を作成したいのですが、どのようなm、n、edgeであっても動作するようなアルゴリズムにするにはどのようにしたらよいでしょうか。関数のコードを書いて頂けると大変助かるのですが、もしご面倒な場合はどのような配列を作って。。どのように比較して。。といったような手順を教えて頂くでも構いません。







1点疑問点がありますが、原点(0,0)が中心にあると考えなければ簡単です。

つまり、図の左上(-10,10)を(0,0)と考えるだけです。

以下の関数で大きさが変わっても計算できます。



int foo( int m, int n, int edge, int x, int y)

{

int dx,dy;

int e2 = edge*2;

dx = (int)((double)(x+edge)/e2*n);

dy = (int)((double)(edge-y)/e2*m);

return dy*n+dx;

}



疑問点ですが

1ブロックの範囲です。

(-10,10)が0で(-10,5)が3ならば、普通に考えて(-10,-10)は12です。

実際、上の関数でも12を返します。

でも「x=-10、y=-10を渡すと9を返す」と書かれています。

特別なルールがあるのであれば、その条件を追加してみてください。

右はじと底辺部分に注意すればいいのか、中心からの距離に依存するのかなど質問内容からはわかりませんので、頑張ってください。








挿絵の画像が、いかにも宿題っぽいな。



「汎用のアルゴリズムが思いつかず」 とあるけれども、

「汎用」でなく「専用」のアルゴリズムだとダメなのか?



それに、「専用」のアルゴリズムなら思いつくのか?





ヒントだけ、出そう。

添付の画像 と 下のキーワード をみて、自分で考えてくれ。

・左上の点の座標からの距離 (X方向、Y方向 でそれぞれ)

・マスひとつ分の大きさは? (X方向、Y方向 でそれぞれ)

・マス何個分の距離か? (X方向、Y方向 でそれぞれ)

・番号との対応関係 (下の図で 「+3」 の箇所は、どうして 「+3」 なのか)

没有评论:

发表评论