| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1947 人关注过本帖, 2 人收藏
标题:旋转方阵
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
总觉得我以前在这里就写过类似的(好像还简单分析过),可找不到了。再写一个。
程序代码:
#include<stdio.h>

int cal(int n, int row, int col)
{
    int d, t;

    if(row <= col)
    {
        d = row < n - 1 - col ? row : n - 1 - col;
        t = row + col - d * 2;
    }
    else
    {
        d = col < n - 1 - row ? col : n - 1 - row;
        t = (n - 1 - d * 2) * 4 - (row + col - d * 2);
    }
    return (n - d) * d * 4 + t;
}

int main()
{
    int n, i, j;

    scanf("%d", &n);
    for(i = 0; i < n; i++, puts(""))
    for(j = 0; j < n; j++)
        printf("%4d", cal(n, i, j));
    return 0;
}

重剑无锋,大巧不工
2014-11-26 15:35
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用beyondyf在2014-11-26 15:35:37的发言:

总觉得我以前在这里就写过类似的(好像还简单分析过),可找不到了。再写一个。
#include
 
int cal(int n, int row, int col)
{
    int d, t;
 
    if(row <= col)
    {
        d = row < n - 1 - col ? row : n - 1 - col;
        t = row + col - d * 2;
    }
    else
    {
        d = col < n - 1 - row ? col : n - 1 - row;
        t = (n - 1 - d * 2) * 4 - (row + col - d * 2);
    }
    return (n - d) * d * 4 + t;
}
 
int main()
{
    int n, i, j;
 
    scanf("%d", &n);
    for(i = 0; i < n; i++, puts(""))
    for(j = 0; j < n; j++)
        printf("%4d", cal(n, i, j));
    return 0;
}

好高端 学习了
2014-11-27 13:27
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用zklhp在2014-11-27 13:27:33的发言:


好高端 学习了

我试了试 发现我的更快 嘻嘻
2014-11-27 14:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 13 楼 zklhp
在小范围内输出全部矩阵我的代码没有优势。计算一个元素需要进行若干次加减和乘法运算,而填充数组则借助于前一次的结果只需要进行几次判断而已。

我的代码优势在于空间消耗少,局部计算的独立性。比如如果要计算100000 X 100000的矩阵呢,目前大多数个人电脑的内存未必能存得下这么大的矩阵。结果用屏幕显示也不现实,但可以输出到文件里。

而对于这么大的矩阵,往往我们并不需要它的全部,而只需要其中的一部分。比如只想看看其中第10000至10010行与第10000至10010列这一小块的值,这时才是我的代码发挥作用的时候。类似的实际应用如电子地图。

另外,也想看看你的代码,交流一下编码技巧也好。

重剑无锋,大巧不工
2014-12-02 16:34
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用beyondyf在2014-12-2 16:34:46的发言:

在小范围内输出全部矩阵我的代码没有优势。计算一个元素需要进行若干次加减和乘法运算,而填充数组则借助于前一次的结果只需要进行几次判断而已。
 
我的代码优势在于空间消耗少,局部计算的独立性。比如如果要计算100000 X 100000的矩阵呢,目前大多数个人电脑的内存未必能存得下这么大的矩阵。结果用屏幕显示也不现实,但可以输出到文件里。
 
而对于这么大的矩阵,往往我们并不需要它的全部,而只需要其中的一部分。比如只想看看其中第10000至10010行与第10000至10010列这一小块的值,这时才是我的代码发挥作用的时候。类似的实际应用如电子地图。
 
另外,也想看看你的代码,交流一下编码技巧也好。

程序代码:
#include <iostream>
#include <vector>

using std::cout;
using std::cin;
using std::endl;
using std::vector;

int main(void)
{

    int n = 0;
    cin >> n;
    vector<vector<int>> ivec(n ,vector<int>(n, 0));
    int dir = 1;
    int x = 0;
    int y = 0;
    int i = 1;
    for (i = 1; i <= n*n;)
    {
        switch (dir)
        {
        case 1:
            for (;y != n; ++y)
            {
                if (ivec[x][y] != 0)
                    break;
                ivec[x][y] = i++;
                // cout << "(" << x << ", " << y << ") = " << i-1 << endl;
            }
            --y;
            ++x;
            ++dir;
            break;
        case 2:
            for (;x != n; ++x)
            {
                if (ivec[x][y] != 0)
                    break;
                ivec[x][y] = i++;
                // cout << "(" << x << ", " << y << ") = " << i-1 << endl;
            }
            --x;
            --y;
            ++dir;
            break;
        case 3:
            for (;y >= 0; --y)
            {
                if (ivec[x][y] != 0)
                    break;
                ivec[x][y] = i++;
                // cout << "(" << x << ", " << y << ") = " << i-1 << endl;
            }
            ++y;
            --x;
            ++dir;
            break;
        case 4:
            for (;x >= 0; --x)
            {
                if (ivec[x][y] != 0)
                    break;
                ivec[x][y] = i++;
                // cout << "(" << x << ", " << y << ") = " << i-1 << endl;
            }
            ++x;
            ++y;
            dir = 1;
            break;
        default:
            break;
        }
    }
    for (x = 0; x != n; ++x)
    {
        for (y = 0; y != n; ++y)
            cout << ivec[x][y] << "\t";
        cout << endl;
    }
    return 0;
}


题目是不用数组的C++ 所以用的容器 其实一样

你说的有道理 我这个需要全部填充才行 但好像也可以改成你说的那种 需要更多的判断罢

2014-12-02 19:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 15 楼 zklhp
switch在我看来也是判断。我的代码算是以时间换空间,填充则是以空间换时间。至于填充方式也可以有多种,不过大同小异,差别大概就是判断次数和几次加减运算的差别。

呵呵,看你的代码透着一股汇编的气息(不是贬意)

重剑无锋,大巧不工
2014-12-02 23:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用beyondyf在2014-12-2 23:30:21的发言:

switch在我看来也是判断。我的代码算是以时间换空间,填充则是以空间换时间。至于填充方式也可以有多种,不过大同小异,差别大概就是判断次数和几次加减运算的差别。
 
呵呵,看你的代码透着一股汇编的气息(不是贬意)

如果真是汇编的话应该转换为矩阵运算 用AVX指令
2014-12-03 14:02
快速回复:旋转方阵
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.043939 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved