Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062566
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-03-28 23:21:24

今天看到一个螺旋队列的例子,看到后第一想到的这是个用表驱动编程的好例子。就顺便解了下。当然这个是非常简单的例子。 主要是给示例下什么事表驱动。 这是直接查找。

题目:
/* 螺旋队列
   设1的坐标是(0,0),的方向向右为正,y方向向下为正,
例如,7的坐标为(-1,-1),2的坐标为(0,1)。
   编程实现输入任意一点坐标(x,y),输出所对应的数字。
*/
     43 44 45 46 47 48 49
     42 21 22 23 24 25 26
     41 20   7   8   9 10 27
     40 19   6   1   2 11 28  
     39 18   5   4   3 12 29
     38 17 16 15 14 13 30
     37 36 35 34 33 32 31

网上人家给的解法。 说实话,我没具体的看这个解。只是顺便拷贝过来参考下和表驱动的差异。
//======================================================
算法:by smilelance (绝对独家,超级详细,如果你看完这个还不懂,我就无语了~~~)
1、从1开始向外扩散,任意数字所在层应为:t = max(|x|,|y|)。比如5,9在第一层
2、右上角斜线数字为:ur = (2t+1)*(2t+1) 左下角斜线数字为:dl = 2t*2t+1
3、每一圈数字分为四个区域:比如25所在的第二层:
21,22,23,24,25 A区,y == -t     
17,18,19,20,   B区,x == -t 除掉A区数字
13,14,15,16,   C区,y == t   除掉AB区数字
10,11,12     D区,x == t   除掉ABC区数字

4、每一圈数字总数都是8t,右上角数字最大, 减去若干个t就得到四个边的数字,

这就是通过右上角数字取圈内任意数字的关键算法了
*/
#define abs(a)    ((a)>0?(a):(-a))
#define max(a,b) ((a)>(b)?(a):(b))

void print_helix_number(int n){
    int x, y;
    for(y=-n;y<=n;y++) {
        for(x=-n;x<=n;x++){
            printf("%5d",lookupHelixNumber(x,y)); //n 5以上数字就不对齐拉,嘿嘿
        }
      printf("\n");

    }
}

int lookupHelixNumber(int x, int y){
int t = max(abs(x), abs(y));
int ur = (2*t+1)*(2*t+1);
int n = 1;
if ( y == -t)
    n = ur-t+x;
else if (x == -t)
    n = ur-3*t-y;     //3t, 5t啥的是规律,观察一圈数字就知道拉
else if (y == t)
    n = ur-5*t-x;
else
    n = ur-7*t+y;
   
return n;
}

//======================================================


表驱动解法:

表驱动例子

#include
using namespace std;
typedef struct
{
    int x;
    int y;
    int v;
}VALUE;

表驱动例子
VALUE value[] =
{
    {-3,-3,43}, {-2,-3,44}, {-1,-3,45}, {0,-3,46}, {1,-3,47}, {2,-3,48}, {3,-3,49},
    {-3,-2,42}, {-2,-2,21}, {-1,-2,22}, {0,-2,23}, {1,-2,24}, {2,-2,25}, {3,-2,26},
    {-3,-1,41}, {-2,-1,20}, {-1,-1,7}, {0,-1,8}, {1,-1,9}, {2,-1,10}, {3,-1,27},
    {-3,0,40}, {-2,0,19}, {-1,0,6}, {0,0,1}, {1,0,2}, {2,0,11}, {3,0,28},
    {-3,1,39}, {-2,1,18}, {-1,1,5}, {0,1,4}, {1,1,3}, {2,1,12}, {3,1,29},
    {-3,2,38}, {-2,2,17}, {-1,2,16}, {0,2,15}, {1,2,14}, {2,2,13}, {3,2,30},
    {-3,3,37}, {-2,3,36}, {-1,3,35}, {0,3,34}, {1,3,33}, {2,3,32}, {3,3,31}
};


int main()
{
    cout << "hello " << endl;
    int x; int y;
    scanf("%d",&x);
    scanf("%d",&y);
    int i=0;
    for (i=0; i<49; i++)
    {
        if (value[i].x == x
            && value[i].y == y )
        {
            cout << "the value is:" << value[i].v << endl;
            break;
        }
    }

    if (i == 49)
    {
        cout << "bad input" << endl;
    }
    getchar();
}

//可以看出表驱动解法确实非常简单


阅读(518) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~