鱼C论坛

 找回密码
 立即注册
查看: 1959|回复: 15

C语言 数组的循环移动问题

[复制链接]
发表于 2015-11-13 12:01:36 | 显示全部楼层 |阅读模式
15鱼币
二维数组向右循环移动,
先输入 n,m,代表a[n][m].
然后输入 数组
最后输入循环位数

输出 循环后的数组。
举例              输出
3 3
1 2 3            3 1 2
4 5 6            6 4 5
7 8 9            9 7 8
7

首先我初学,所以定义的变量有点乱,希望大神们勿喷。
还有 我每一块 都注释了,不知道我的思路 有没有对。
出现 问题 ,输入完 循环位数 后,程序就错误停止了,不知什么原因。
# include <stdio.h>
main()
{
        int a[100][100],b[100][100],i,n,m,j,k,x,p=0;
        scanf("%d %d",&n,&m);
        x=m;
        for(j=0;j<n;j++)
        {
                for(k=0;k<m;k++)
                {
                        scanf("%d",&a[j][k]);
                }
        }              
        scanf("%d",&i);  //上面这部分 输入数组及循环位数 
        if(i>m)
            i= i % m;    //这部分如果循环位数超出列个数(m),求余。 
    for(j=0;j<n;j++)
        {
                for(k=0;k<m;k++)
                {
                        b[j][k]=a[j][m-i];
                        m++;
                }
        } 
//移动数组,将每行最后如需移动的数据移动到b数组,
//如举例7%3==1,移动一次,就把a数组最后一列移动到b数组              
        for(j=0;j<n;j++)
        {
                for(k=i;k<x;k++)
                {
                        b[j][k]=a[j][p];
                        p++;
                }
        }
//将a数组 的前几列接在刚刚的b数组后面,完成移动。 
        for(j=0;j<n;j++)
        {
                for(k=0;k<m;k++)
                {
                        printf("%d ",b[j][k]); 
                }
                printf("\n");  //输出b数组 
        }                           
}

不知道 我的这个思路 是不是 对的。求指点

最佳答案

查看完整内容

这样看起来更清爽~~ #include int main() { int a[100][100], b[100][100], m, n, x; scanf("%d%d", &m, &n); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) scanf("%d", &a[j]); scanf("%d", &x); x = x%n; for (int i = 0; i < m; i++) { for (int j = n - 1; j >= 0; j--) { if (j > n - 1 - x)//把每行后x个元素位置不变地保存到b数组里 b[j] = a[j]; if (j >= x)// ...

点评

找到满意答案后记得给他选为最佳。  发表于 2015-11-15 22:23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-13 12:01:37 | 显示全部楼层
这样看起来更清爽~~
#include<stdio.h>
int main()
{
        int a[100][100], b[100][100], m, n, x;
        scanf("%d%d", &m, &n);
        for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                        scanf("%d", &a[i][j]);

        scanf("%d", &x);
        x = x%n;
        for (int i = 0; i < m; i++)
        {
                for (int j = n - 1; j >= 0; j--)
                {
                        if (j > n - 1 - x)//把每行后x个元素位置不变地保存到b数组里
                                b[i][j] = a[i][j];
                        if (j >= x)//前面的元素依次往后移动x个位置
                                a[i][j] = a[i][j - x];
                        if (j < x)//处理每行前x个元素,需要从b数组里复制过来
                                a[i][j] = b[i][n - x + j];
                }
                for (int j = 0; j < n; j++)
                        printf("%d ", a[i][j]);
                printf("\n");
        }
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-13 12:49:56 | 显示全部楼层
少年这是准备参加acm么
在哪个oj平台上玩啊

全是AC基础算法题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-13 17:49:30 | 显示全部楼层
ryxcaixia 发表于 2015-11-13 12:49
少年这是准备参加acm么
在哪个oj平台上玩啊

:big,不不不,学生,这是作业。求指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-13 18:17:25 | 显示全部楼层
觉得思路不对啊  ,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-13 19:03:48 | 显示全部楼层
q312102408 发表于 2015-11-13 18:17
觉得思路不对啊  ,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了

就用 一个变量 感觉脑子不够用,用二个,把一个转到另一个就行了,这个感觉清楚一点。思路哪里不对,我也总感觉不对,而且都不能运行:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-13 19:12:50 | 显示全部楼层
本帖最后由 q312102408 于 2015-11-13 19:31 编辑

在定义个变量
int p1;

for (j=0;j<n;j++)
{
        x=a[j][0];   //把1空出来, 挖出一个坑
        p=0;
      for (k=0;k<m;k++)
{      
        p1=(m-p+i)%m;  //找填坑的
        a[j][p]=a[j][p1];  
        p=p1;   //填过后,他自身成为坑了
}
a[j][p]=x;  把最后一个坑填上..
}


//可能有点问题,自己调试下

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
独一无② + 5 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-13 19:37:39 | 显示全部楼层
q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;

好的,谢谢。我先理解一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-13 19:40:23 | 显示全部楼层
最好 画图  ,只看一行   ,    挖一个坑,然后找填坑的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-13 19:51:08 | 显示全部楼层
q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;

我发现 数组真的可以循环了,就是貌似移动的位置 有点不对。我在改改试试,改不来在请教您吧,太谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-13 20:45:24 | 显示全部楼层
q312102408 发表于 2015-11-13 19:40
最好 画图  ,只看一行   ,    挖一个坑,然后找填坑的

好像不对,我发现这个 方法只能 实现二列 数据互相对换,而不能循环移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-14 10:18:49 | 显示全部楼层
这代码问题好像比较多。。
第15行if判断是多余的
处理的时候第二层循环可以从后往前遍历比较方便
19行那个循环,每次都m++,k++,永远达不到循环结束的条件k<m啊。。死循环。。
后面都没有看了,楼主还是自己再检查检查吧……

我写了一个,思路比较简单直接,就是分段处理的时候要细心一点~
#include<stdio.h>
int main()
{
        int a[100][100], b[100][100], m, n, x;
        scanf("%d%d", &m, &n);
        for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                        scanf("%d", &a[i][j]);

        scanf("%d", &x);
        x = x%n;
        for (int i = 0; i < m; i++)
        {
                for (int j = n-1; j >= 0; j--)
                {
                        if (j > n-1-x)
                        {
                                b[i][j] = a[i][j];
                                if (j - x >= 0)
                                        a[i][j] = a[i][j - x];
                        }
                        else if (j > x-1 && j - x >= 0)
                                a[i][j] = a[i][j - x];
                        if (j < x)
                                a[i][j] = b[i][n - x + j];
                }
                for (int j = 0; j < n; j++)
                        printf("%d ", a[i][j]);
                printf("\n");
        }
        return 0;
}

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
独一无② + 5 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-14 11:13:04 | 显示全部楼层
0xcc 发表于 2015-11-14 10:18
这代码问题好像比较多。。
第15行if判断是多余的
处理的时候第二层循环可以从后往前遍历比较方便

恩恩,我找到自己的错误了,现在可以运行了,你写的这个代码,中间 那部分 循环交换  部分 看不懂,可以简单注释一下吗?谢谢~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-16 14:25:30 | 显示全部楼层
独一无② 发表于 2015-11-14 11:13
恩恩,我找到自己的错误了,现在可以运行了,你写的这个代码,中间 那部分 循环交换  部分 看不懂,可以 ...

感谢楼主认同~b数组用一维更省空间,并且时间不变~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-11-16 20:08:56 | 显示全部楼层
我用挖坑排序排成功了  .(宽度+偏移)%2==0的花会出现不能执行的问题 .  我把这个问题做了减一操作

给你源码,你研究研究

        int a[N] = { 0,1,2,3,4,5,6,7,8 };
        // c是偏移位数 ,N是
        int b = a[0], c = 1, e, f ;
        int d=0;
       
        do
        {
                ((N + c) % 2==0) ? (c--, f = 1) : (f = 0);
                e = 0;
                b = a[0];
                for (int n = 1; n < N; n++)
                {
                        d = (c + e) % N;
                        a[e] = a[d];
                        e = d;
                }
                a[e] = b;
               
        } while (c=f);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 14:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表