怪异的洗牌

来源:互联网 发布:语音交友软件 编辑:程序博客网 时间:2024/06/02 10:56

题目连接

这一题,其实就是个模拟题,没有什么算法,但是由于没有注意题目中的每一次操作,都需要重新赋位置的数值,导致wa了几次,下次注意题意,很重要。

AC代码:

#include <stdio.h>int main(){int n, k, i, j, m, f;int pos;int a[1005], b[1005];while(~scanf("%d%d", &n, &k)&&n){for(i = 0;i < n;i ++)a[i] = i + 1;for(i = 0;i < k;i ++){scanf("%d", &pos);int size = n - pos;for(j = 0;j < n;j++)b[(j+size)%n] = a[j];//shiftfor(f = 0,m =n / 2 - 1;f<m;f ++,m --)//flip{int tmp;tmp = b[f];b[f] = b[m];b[m] = tmp;}for(j = 0;j < n;j ++)    a[j] = b[j];//provide next array for change digits}for(i = 0;i < n;i ++)printf("%d ",b[i]);printf("\n");}return 0;}

#include <stdio.h>int main(){int n, k, i, j, m, f;int pos;int a[1005], b[1005];while(scanf("%d %d", &n, &k)!=EOF&&n!=0){//int size = n - pos;int tmp;for(i = 0;i < n;i ++)a[i] = i + 1;for(i = 0;i < k;i ++){/*for(j = 0;j < n;j++)b[(j+size)%n] = a[j];*/scanf("%d", &pos);for(j = pos;j < n;j ++)b[j - pos] = a[j];for(j = pos - 1;j>=0;j --)    a[n - pos  + j] = a[j];  for(j = 0;j < n - pos;j++)      a[j] = b[j];for(f = 0,m =n / 2 - 1;f<m;f ++,m --){tmp = a[f];a[f] = a[m];a[m] = tmp;}}for(i = 0;i < n;i ++)  printf("%d ",a[i]);printf("\n");}return 0;}