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数组
}
}
不知道 我的这个思路 是不是 对的。求指点 这样看起来更清爽~~
#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;
} 少年这是准备参加acm么
在哪个oj平台上玩啊
全是AC基础算法题 ryxcaixia 发表于 2015-11-13 12:49
少年这是准备参加acm么
在哪个oj平台上玩啊
:big,不不不,学生,这是作业。求指导 觉得思路不对啊,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了 q312102408 发表于 2015-11-13 18:17
觉得思路不对啊,首先 你用一个数组就行了啊 , 覆盖问题 你可以用一个临时变量保存就行了
就用 一个变量 感觉脑子不够用,用二个,把一个转到另一个就行了,这个感觉清楚一点。思路哪里不对,我也总感觉不对,而且都不能运行:cry 本帖最后由 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;把最后一个坑填上..
}
//可能有点问题,自己调试下 q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;
好的,谢谢。我先理解一下 最好 画图,只看一行 , 挖一个坑,然后找填坑的 q312102408 发表于 2015-11-13 19:12
在定义个变量
int p1;
我发现 数组真的可以循环了,就是貌似移动的位置 有点不对。我在改改试试,改不来在请教您吧,太谢谢了 q312102408 发表于 2015-11-13 19:40
最好 画图,只看一行 , 挖一个坑,然后找填坑的
好像不对,我发现这个 方法只能 实现二列 数据互相对换,而不能循环移动
这代码问题好像比较多。。
第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;
} 0xcc 发表于 2015-11-14 10:18
这代码问题好像比较多。。
第15行if判断是多余的
处理的时候第二层循环可以从后往前遍历比较方便
恩恩,我找到自己的错误了,现在可以运行了,你写的这个代码,中间 那部分 循环交换部分 看不懂,可以简单注释一下吗?谢谢~ 独一无② 发表于 2015-11-14 11:13
恩恩,我找到自己的错误了,现在可以运行了,你写的这个代码,中间 那部分 循环交换部分 看不懂,可以 ...
感谢楼主认同~b数组用一维更省空间,并且时间不变~ 我用挖坑排序排成功了.(宽度+偏移)%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]