独一无② 发表于 2015-11-13 12:01:36

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

二维数组向右循环移动,
先输入 n,m,代表a.
然后输入 数组
最后输入循环位数

输出 循环后的数组。
举例            输出
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,b,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);
                }
        }            
        scanf("%d",&i);//上面这部分 输入数组及循环位数
        if(i>m)
          i= i % m;    //这部分如果循环位数超出列个数(m),求余。
    for(j=0;j<n;j++)
        {
                for(k=0;k<m;k++)
                {
                        b=a;
                        m++;
                }
        }
//移动数组,将每行最后如需移动的数据移动到b数组,
//如举例7%3==1,移动一次,就把a数组最后一列移动到b数组            
        for(j=0;j<n;j++)
        {
                for(k=i;k<x;k++)
                {
                        b=a;
                        p++;
                }
        }
//将a数组 的前几列接在刚刚的b数组后面,完成移动。
        for(j=0;j<n;j++)
        {
                for(k=0;k<m;k++)
                {
                        printf("%d ",b);
                }
                printf("\n");//输出b数组
        }                           
}

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

0xcc 发表于 2015-11-13 12:01:37

这样看起来更清爽~~
#include<stdio.h>
int main()
{
        int a, b, 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);

        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 = a;
                        if (j >= x)//前面的元素依次往后移动x个位置
                                a = a;
                        if (j < x)//处理每行前x个元素,需要从b数组里复制过来
                                a = b;
                }
                for (int j = 0; j < n; j++)
                        printf("%d ", a);
                printf("\n");
        }
        return 0;
}

ryxcaixia 发表于 2015-11-13 12:49:56

少年这是准备参加acm么
在哪个oj平台上玩啊

全是AC基础算法题

独一无② 发表于 2015-11-13 17:49:30

ryxcaixia 发表于 2015-11-13 12:49
少年这是准备参加acm么
在哪个oj平台上玩啊



:big,不不不,学生,这是作业。求指导

q312102408 发表于 2015-11-13 18:17:25

觉得思路不对啊,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了

独一无② 发表于 2015-11-13 19:03:48

q312102408 发表于 2015-11-13 18:17
觉得思路不对啊,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了

就用 一个变量 感觉脑子不够用,用二个,把一个转到另一个就行了,这个感觉清楚一点。思路哪里不对,我也总感觉不对,而且都不能运行:cry

q312102408 发表于 2015-11-13 19:12:50

本帖最后由 q312102408 于 2015-11-13 19:31 编辑

在定义个变量
int p1;

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


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

独一无② 发表于 2015-11-13 19:37:39

q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;



好的,谢谢。我先理解一下

q312102408 发表于 2015-11-13 19:40:23

最好 画图,只看一行   ,    挖一个坑,然后找填坑的

独一无② 发表于 2015-11-13 19:51:08

q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;



我发现 数组真的可以循环了,就是貌似移动的位置 有点不对。我在改改试试,改不来在请教您吧,太谢谢了

独一无② 发表于 2015-11-13 20:45:24

q312102408 发表于 2015-11-13 19:40
最好 画图,只看一行   ,    挖一个坑,然后找填坑的

好像不对,我发现这个 方法只能 实现二列 数据互相对换,而不能循环移动

0xcc 发表于 2015-11-14 10:18:49

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

我写了一个,思路比较简单直接,就是分段处理的时候要细心一点~
#include<stdio.h>
int main()
{
        int a, b, 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);

        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 = a;
                                if (j - x >= 0)
                                        a = a;
                        }
                        else if (j > x-1 && j - x >= 0)
                                a = a;
                        if (j < x)
                                a = b;
                }
                for (int j = 0; j < n; j++)
                        printf("%d ", a);
                printf("\n");
        }
        return 0;
}

独一无② 发表于 2015-11-14 11:13:04

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


恩恩,我找到自己的错误了,现在可以运行了,你写的这个代码,中间 那部分 循环交换部分 看不懂,可以简单注释一下吗?谢谢~

0xcc 发表于 2015-11-16 14:25:30

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

感谢楼主认同~b数组用一维更省空间,并且时间不变~

q312102408 发表于 2015-11-16 20:08:56

我用挖坑排序排成功了.(宽度+偏移)%2==0的花会出现不能执行的问题 .我把这个问题做了减一操作

给你源码,你研究研究

        int a = { 0,1,2,3,4,5,6,7,8 };
        // c是偏移位数 ,N是
        int b = a, c = 1, e, f ;
        int d=0;
       
        do
        {
                ((N + c) % 2==0) ? (c--, f = 1) : (f = 0);
                e = 0;
                b = a;
                for (int n = 1; n < N; n++)
                {
                        d = (c + e) % N;
                        a = a;
                        e = d;
                }
                a = b;
               
        } while (c=f);
页: [1]
查看完整版本: C语言 数组的循环移动问题