題目如下:
21 22 23 24 25 26
20 7 8 9 10 27
19 6 1 2 11 28
18 5 4 3 12 29
17 16 15 14 13 30
如圖:設(shè)“1”的坐標(biāo)為(0,0) “7”的坐標(biāo)為(-1,-1) 編寫一個(gè)小程序,使程序做到輸入坐標(biāo)(X,Y)之后顯示出相應(yīng)的數(shù)字。我的程序,沒有怎么調(diào)整,很粗糙,不過,實(shí)現(xiàn)就行了:#include <iostream>
using namespace std;
/*
設(shè)“1”的坐標(biāo)為(0,0) “7”的坐標(biāo)為(-1,-1) 編寫一個(gè)小程序,
使程序做到輸入坐標(biāo)(X,Y)之后顯示出相應(yīng)的數(shù)字。
*/
/************************************************************************
**算法:數(shù)字是圍繞1“盤旋”, 移動(dòng)的步進(jìn)值是1,1,2,2,3,3,4,4,5,5,6,6……
**對(duì)于一個(gè)數(shù),我們可以算出他移動(dòng)的步數(shù),然后和一個(gè)沒有走完的偏移,如果恰好走完就是
**偏移為0。
**然后我們對(duì)于輸入的值,我們模擬走過的路徑來求值,步數(shù)表示已經(jīng)走過而偏移表示要繼續(xù)
**走偏移數(shù)目的步數(shù)
*************************************************************************/
enum X {RIGHT = 1, DOWM = 1,LEFT = -1, UP = -1};
/*
*get_attribution()函數(shù)取得輸入值移動(dòng)過幾次用times表示,
*以及比每次移動(dòng)的終點(diǎn)要多走的步數(shù),用dif表示
*/
void get_attribution(int in_number, int &dif, int ×) {
int i = 0;
in_number--;
while (in_number >= 0) {
in_number = in_number - (i/2+1);
times = i;
i++;
if (in_number >= 0) {
dif = in_number;
}
}
}
int main()
{
int a = 21; //輸入一個(gè)數(shù)值,這里就不人機(jī)交互輸入了
int dif = 0, times = 0; // 起始偏移距離和次數(shù)
get_attribution(a, dif, times);
cout << "偏移" << dif << "中間走了" << times << "次" << endl;
int x = 0, y = 0; //起始端點(diǎn)
for (int i = 1; i <= times; i++) {
switch (i%4) { //已經(jīng)走過了一些步數(shù)
case 0: //上移到下一個(gè)端點(diǎn)
y += UP *((i-1)/2+1); break;
case 1: //右移到下一個(gè)端點(diǎn)
x += RIGHT * ((i-1)/2+1); break;
case 2: //下移到下一個(gè)端點(diǎn)
y += DOWM * ((i-1)/2+1); break;
case 3: //左移到下一個(gè)端點(diǎn)
x += LEFT * ((i-1)/2+1); break;
}
}
switch (times%4) { //繼續(xù)完成要偏移的值
case 3: //接下來的操作是上移,x不變,y減小
y += UP * dif; break;
case 0: //接下來的操作是右移
x += RIGHT * dif; break;
case 1: //接下來的操作是下移
y += DOWM * dif; break;
case 2: //接下來的操作是左移
x += LEFT * dif; break;
}
cout << "(" << x << ", " << y << ")" << endl;
return 0;
}
作者給出了自己的程序,太長(zhǎng)我就引用了,也給出了人家的程序 ,挺不錯(cuò),如下:#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int newVal(int x, int y)
{
//以結(jié)點(diǎn)1為原點(diǎn)
//以相鄰兩結(jié)點(diǎn)間的距離為單位(如結(jié)點(diǎn)2與結(jié)點(diǎn)3的之間線段)
//結(jié)點(diǎn)7所在的正方形(由結(jié)點(diǎn)2、3、4、5、6、7、8、9構(gòu)成)的邊長(zhǎng)
//的一半為1,即結(jié)點(diǎn)7到原點(diǎn)1的最大投影距離為1。
//于是由結(jié)點(diǎn)坐標(biāo),可以求出此結(jié)點(diǎn)所在的正方形的投影距離:
int r = max(abs(x),abs(y));
//進(jìn)行坐標(biāo)變換,即把坐標(biāo)原點(diǎn)移動(dòng)到正方形的一個(gè)角結(jié)點(diǎn)上,
//使整個(gè)正方形落在第一象限,例如,當(dāng)r=1時(shí),將把坐標(biāo)原點(diǎn)從結(jié)點(diǎn)1
//移動(dòng)到結(jié)點(diǎn)7。
x += r;
y += r;
//正方形的邊長(zhǎng),等于投影距離的兩倍
int d = 2*r;
int s; //s為結(jié)點(diǎn)在自己的正方形的偏移量
if (y == 0)
s = 3*d + x;
else if (x == 0)
s = 2*d + (d-y);
else if (y == d)
s = d + (d-x);
else
s = y;
//pow((r+1),2)為內(nèi)層的結(jié)點(diǎn)數(shù)。
//例如,結(jié)點(diǎn)10的內(nèi)層由結(jié)點(diǎn)1和正方形A(2、3、4、5、7、8、10)構(gòu)成
//這些內(nèi)層的總結(jié)點(diǎn)數(shù)恰為:(正方形A的邊長(zhǎng)+1)的平方,
//因?yàn)椋赫叫蜛的邊長(zhǎng) =(結(jié)點(diǎn)10所在正方形的半徑-1)*2
//故:內(nèi)層結(jié)點(diǎn)數(shù) = (結(jié)點(diǎn)10所在正方形的邊長(zhǎng)-1)的平方
//結(jié)點(diǎn)值 = 在當(dāng)前正方形的偏移量 + 內(nèi)層的結(jié)點(diǎn)數(shù)
s += pow((d-1),2);
return s;
}
int main(int argc,char * argv[])
{
int x, y;
cout <<"請(qǐng)輸入坐標(biāo)(x y):";
while (cin>>x>>y)
{
cout <<"坐標(biāo)所在的結(jié)點(diǎn)值為:"<<f(x, y)<<endl;
cout <<"請(qǐng)輸入坐標(biāo)(x y):";
}
return 0;
}
----------------------------------------------------------------------------------------------------------------------------------
這是我寫的,算法請(qǐng)看二樓
#include<stdio.h>
int GetX(int x)//求(X,0)
{
int result=1,i=0;
if (x==0) return result;
else if (x>0)
{
for(i=0;i<x;i++)
{
result = result + 1+8*i;//通項(xiàng)公試. a(n) = a(n-1) + a(0) + d*(n-1)
}
return result;
}
else if(x<0)
{
for(i=0;i<-x;i++)
{
result = result + 5+8*i;
}
return result;
}
}
int GetY(int y)//求(0,Y)
{
int result=1,i=0;
if (y==0) return result;
else if (y>0)
{
for(i=0;i<y;i++)
{
result = result + 7+8*i;
}
return result;
}
else if(y<0)
{
for(i=0;i<-y;i++)
{
result = result + 3+8*i;
}
return result;
}
}
int GetNum(int x,int y)//求(X,Y)對(duì)應(yīng)的值
{
if(abs(x)<=abs(y))
{
if(y<=0)
return GetY(y)+x;
else return GetY(y)-x;
}
else
{
if(x<=0)
return GetX(x)-y;
else return GetX(x)+y;
}
}
void main()
{
int x,y;
while(1)
{
printf("please input (X,Y)\n");
scanf("%d,%d",&x,&y);
printf("The result is:%d\n",GetNum(x,y));
}
getch();
}