首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求解一个简单的有关问题。

2012-12-28 
求解一个简单的问题。。。。我是一个初学者。。遇到了这样一个问题。。在Darkness的研究中,他发现这些金字塔是通过

求解一个简单的问题。。。。
我是一个初学者。。遇到了这样一个问题。。求解一个简单的有关问题。
在Darkness的研究中,他发现这些金字塔是通过一圈一圈堆叠起来建造的,如果将其每块砖用一个从1开始的正整数进行标号,那底面边长为5的金字塔建造过程可以通过下面这个矩阵加以描述。

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
现在请根据给定的底面边长N,仿造上述矩阵描述金字塔的建造过程。

Input
多组测试数据。

每组数据一行,一个正整数N(1<=n<=50),表示金字塔的底面边长。

Output
对于每组数据,输出一个N*N的矩阵,矩阵中每个数使用空格隔开。(具体格式请参照样例)

Sample Input
5
Sample Output
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9


以上是题面。。
我在写这道题是遇到了一个状况,就是输入1到31时都会出现正确答案。。但是32以后就出现一种很奇怪的异常,每一行数字都一样。。不知道是什么状况。。。。献上代码和异常情况,求高人破求解一个简单的有关问题。。。。。





[解决办法]
#include <stdio.h>
#define MAXN 100
int m[MAXN+2][MAXN+2];
char d;
int x,y,k,n;
void main() {
    while (1) {
        printf("Input n(1..%d):",MAXN);
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%d",&n)) {


            if (1<=n && n<=MAXN) break;
        }
    }
    y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;
    y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;
    x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;
    x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            m[y][x]=0;
        }
    }
    x=1;
    y=1;
    k=0;
    d='D';
    while (1) {
        k++;
        if (k>n*n) break;
        m[y][x]=k;
        switch (d) {
            case 'D':
                if (0==m[y+1][x])  y++;
                else              {x++;d='R';}
            break;
            case 'R':
                if (0==m[y][x+1])  x++;
                else              {y--;d='U';}
            break;
            case 'U':
                if (0==m[y-1][x])  y--;
                else              {x--;d='L';}
            break;
            case 'L':
                if (0==m[y][x-1])  x--;
                else              {y++;d='D';}
            break;
        }
    }
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            printf(" %06d",m[y][x]);
        }
        printf("\n");
    }
}


窗口宽度显示不下自动换行了。
在cmd窗口中输入命令
程序名.exe >output.txt
将输出重定向到文件output.txt中,然后在记事本里面打开output.txt,“格式”设置不要自动换行。


[解决办法]
要不你就用动态申请,要不就开个大数组.
不要这样用 

int n;
cin>>n;
unsigned int[n][n];

这样改下就ok了
#include <iostream>
using namespace std;


int main()
{
int n;
while(cin>>n)
{
unsigned int a[51][51];
for (int i = 1; i <=n ; i++)
{
for (int j = 0; j < n+1; j++)
{
a[j][i]=0;
}
}
a[1][1]=1;
if(n%2==1)
{
for(int j=1;j<=n/2;j++)
{
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}
for(int i=n-j;i>=j+1;i--)
{
a[j][i]=a[j][i+1]+1;
}
}
int j;
j=(n/2)+1;
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}


}
if(n%2==0)
{
for(int j=1;j<n/2;j++)
{
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}
for(int i=n-j;i>=j+1;i--)
{
a[j][i]=a[j][i+1]+1;
}
}
int j;
j=(n/2);
for(int i=j;i<=n-j+1;i++)
{
a[i][j]=a[i-1][j]+1;
}
for(int i=j+1;i<=n-j+1;i++)
{
a[n-j+1][i]=a[n-j+1][i-1]+1;
}
for(int i=n-j;i>=j;i--)
{
a[i][n-j+1]=a[i+1][n-j+1]+1;
}


}

for(int i=1;i<=n;i++)
{
for(int j=1;j<=n-1;j++)
{
cout<<a[j][i]<<" ";
}
cout<<a[n][i]<<endl;
}
}
return 0;
}


[解决办法]
请无视二楼
#include <stdio.h>
#define MAXN 100
int m[MAXN+2][MAXN+2];
char d;
int x,y,k,n,w;
char str[10];
void main() {
    while (1) {
        printf("Input n(1..%d):",MAXN);
        fflush(stdout);
        rewind(stdin);
        if (1==scanf("%d",&n)) {
            if (1<=n && n<=MAXN) break;
        }
    }
    y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;
    y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;
    x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;
    x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            m[y][x]=0;
        }


    }
    x=1;
    y=1;
    k=0;
    d='D';
    while (1) {
        k++;
        if (k>n*n) break;
        m[y][x]=k;
        switch (d) {
            case 'D':
                if (0==m[y+1][x])  y++;
                else              {x++;d='R';}
            break;
            case 'R':
                if (0==m[y][x+1])  x++;
                else              {y--;d='U';}
            break;
            case 'U':
                if (0==m[y-1][x])  y--;
                else              {x--;d='L';}
            break;
            case 'L':
                if (0==m[y][x-1])  x--;
                else              {y++;d='D';}
            break;
        }
    }
    w=sprintf(str,"%d",n*n);
    for (y=1;y<=n;y++) {
        for (x=1;x<=n;x++) {
            printf(" %0*d",w,m[y][x]);
        }
        printf("\n");
    }
}

热点排行