| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3951 人关注过本帖, 1 人收藏
标题:一个好玩的c语言设计测试(鄙人用了一周搞定)(会数组和循环的就可以)
只看楼主 加入收藏
进门者
Rank: 2
等 级:论坛游民
帖 子:15
专家分:14
注 册:2012-7-31
收藏
得分:1 
以下是引用lz1091914999在2012-8-3 15:00:48的发言:

#include  
#include  
 
int main(void)
{
    char format[] = "%xd ";
    int snake[500][500], width, i, j, count = 0, x = 0, y = 0;
    scanf("%d", &width);
    format[1] = (int)log10(width * width) + 1 + '0';
    snake[width/2][width/2] = width * width;
    for (i = width - 1; i > 0; y -= i - 1, ++x, i -= 2) {
        for (j = 0; j < i; ++j)
            snake[y][x+j] = ++count;
        for (x += i, j = 0; j < i; ++j)
            snake[y+j][x] = ++count;
        for (y += i, j = 0; j < i; ++j)
            snake[y][x-j] = ++count;
        for (x -= i, j = 0; j < i; ++j)
            snake[y-j][x] = ++count;
    }
    for (i = 0; i < width; ++i) {
        for (j = 0; j < width; ++j)
            printf(format, snake[j]);
        putchar('\n');
    }
    return 0;
}

把思路说出来啊,代码注释一下,这样我们不懂的也可以看看
2012-08-04 17:05
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 11楼 进门者
先计算最大值的宽度,然后从外面向里面绕,每个循环都计算出一边,直到最中间。

My life is brilliant
2012-08-04 18:57
老石头
Rank: 2
等 级:论坛游民
帖 子:15
专家分:17
注 册:2012-6-12
收藏
得分:0 
回复 9楼 lz1091914999
    char format[] = "%xd ";
    format[1] = (int)log10(width * width) + 1 + '0';
这两句看不懂,求解答
2012-08-07 22:03
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:1 
哈哈,看9楼的程序用到的知识不是很难,等我复习完二维数组来玩玩这个题~
2012-08-08 15:57
mathspanda
Rank: 2
等 级:论坛游民
帖 子:15
专家分:15
注 册:2012-5-12
收藏
得分:1 
程序代码:
  #include<stdio.h>
  #include<string.h>
  #define MAXN 100
  int a[MAXN][MAXN];
  int main(){
    int n, x, y, tot = 0;
    scanf("%d", &n);
    memset(a, 0, sizeof(a));
    tot = a[x=0][y=n-1] = 1;
    while(tot < n*n) {
      while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;     /* 向下走 */
      while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;    /* 向左走 */
      while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;    /* 向上走 */
      while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;     /* 向右走 */
    }
    for(x = 0; x < n; x++) {
      for(y = 0; y < n; y++) printf("%d ", a[x][y]);
      printf("\n");
    }
    return 0;
  }


  假设从1开始依次填这写。设“笔”的坐标为(x,y),则一开始x=0,y=n-1,即第0行第n-1列。“笔”的移动轨迹是:下、下、下、左、左、左、上、上、上、右、右、下、下、左、上。总之,先是下,到不能填了为止,然后是左,接着是上,最后是右。“不能填”是指再走就出界或者再走就要走到以前填过的格子。如果把所有格式初始化为0,就能很方便地加以判断。

[ 本帖最后由 mathspanda 于 2012-8-8 17:18 编辑 ]
2012-08-08 17:07
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:1 
你们这样想吧!!!在输入的数字之间选一个最小的数和一个最大的数,就可判断这条数字线有多长了。
然后你把它想成一条线去绕正方形,找到绕正方形的规律,在折到第四边时与第一边接合时短一个长度。
接下来就更简单了!!!!我这没编译器不能写
2012-08-08 18:40
justNPC
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:311
注 册:2012-8-11
收藏
得分:0 
程序代码:
#include<stdio.h>
void  main()
{       int a[50][50];
    int i,j,n,count=1;
    i=0;j=0;
    printf("Enter n ");
    scanf("%d",&n);
    while(count<=n*n)
    {       if(i<=(n-1)/2)
        {      for(;j<n-i;j++,count++)  //输出横着的一行 左到右
                a[i][j]=count;
            j--;i++;
                 }
        else{       for(;j>=n-1-i;j--,count++) //输出横着的一行 右到左
                a[i][j]=count;
            j++;i--;
        }
        if(j>=n/2)
        {    for(;i<=j;i++,count++) //输出竖着的一行 上到下
                a[i][j]=count;
            i--;j--;
        }
        else{    for(;i>j;i--,count++)   //输出竖着的一行 下到上
                a[i][j]=count;
            i++;j++;
        }
    }
    for(i=0;i<n;i++)
    {       for(j=0;j<n;j++)
            printf("%3d ",a[i][j]);
        printf("\n");
    }
}
2012-08-13 16:32
回首依依
Rank: 7Rank: 7Rank: 7
来 自:苏州
等 级:黑侠
威 望:1
帖 子:193
专家分:524
注 册:2011-12-3
收藏
得分:0 
这个可以不用数组哦!
程序代码:
#include <stdio.h>
int fun(int x,int y,int n)
{
    if(x==n) return 3*n-y-1;
    if(x==1) return y;
    if(y==1&&x>=2&&x<=n-1) return 3*(n+1)-x;
    if(y==n&&x>=2&&x<=n-1) return y+x-1;
    return fun(x-1,y-1,n-2)+4*(n-1);
}
int main()
{
    int x,y,n;
    scanf("%d",&n);
    for(y=1;y<=n;y++)
    {
        for(x=1;x<=n;x++)
        printf("%-6d",fun(y,x,n));
        printf("\n");
    }
    return 0;
}



[ 本帖最后由 回首依依 于 2012-8-13 17:17 编辑 ]
2012-08-13 17:03
Quest
Rank: 1
来 自:江苏连云港
等 级:新手上路
帖 子:11
专家分:0
注 册:2012-8-13
收藏
得分:0 
看不懂

欲望以提升热忱,毅力以磨平高山。
2012-08-13 21:29
kingfuture
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:8
专家分:23
注 册:2012-8-13
收藏
得分:0 
回复 18楼 回首依依
试了下这个代码,貌似有点问题,鄙人菜鸟,只能借用代码来学习
2012-08-14 07:55
快速回复:一个好玩的c语言设计测试(鄙人用了一周搞定)(会数组和循环的就可以 ...
数据加载中...
 
   



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

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