| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1704 人关注过本帖
标题:数组的一个问题
只看楼主 加入收藏
zhxwe
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-1-18
收藏
 问题点数:0 回复次数:30 
数组的一个问题
一个数组有n个值,如n=3;数组数为{1,2,3,4,5,6,7,8,9}
输出为:1 2 3
  8 9 4
  7 6 5
n=4时 数组为{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
输出为:1  2  3  4
  12 13 14 5
  11 16 15 6
  10  9  8 7
问如何编写此程序?
搜索更多相关主题的帖子: 如何 
2006-01-18 23:46
bullbatLT
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2006-1-13
收藏
得分:0 

不知所云不知道你到底说的什么意思

#include "stdio.h"
#define n 3
void main () {
int iArr[n][n] = {{1,2,3},{8,9,4},{7,6,5}};
printf("%d %d %d\n",iArr[0][0],iArr[0][1],iArr[0][2]);
printf("%d %d %d\n",iArr[1][0],iArr[1][1],iArr[1][2]);
printf("%d %d %d\n",iArr[2][0],iArr[2][1],iArr[2][2]);
}


2006-01-19 11:52
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 

呵呵,有点意思,你等等


2006-01-19 15:33
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 
#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;
int main(){
for(int n; cin>>n; cout<<endl){
vector<vector<int> > board(n,vector<int>(n,0));
for(int i=1,di=0,x=0,y=-1; i<=n*n; i++){
di%=4;
switch(di){
case 0:y++;break;
case 1:x++;break;
case 2:y--;break;
case 3:x--;break;
}
if(x==n || x<0 || y==n || y<0 || board[x][y]){
switch(di){
case 0:y--;break;
case 1:x--;break;
case 2:y++;break;
case 3:x++;break;
}
di++;
i--;
}
else
board[x][y]=i;
}
for(int i=0; i<n ;i++){
if(i) cout<<endl;
for(int j=0; j<n; j++)
cout<<setw(4)<<board[i][j];
}
}
}

2006-01-19 16:41
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

用一维数组的话

#include <iostream>
#include<iomanip>
using namespace std;

int main(){

cout<<"input n: ";
int n;
while(!(cin>>n))
{
cout<<"input error\n";
cin.clear();
while(cin.get()!='\n'){}
cout<<"input n : ";
}
int *p=new int[n];

double half=(n-1)/2;
int circle=0;

for(int line=0; line<n; line++)
{
for(int list=0; list<n; list++)
{
int tmp1=(line > half ? n-line-1: line);
int tmp2=(list > half ? n-list-1: list);
circle=(tmp1 < tmp2 ? tmp1 : tmp2);

int circler_total=0;
int tempN=n;

if(list >= line)
{
for(int i=0; i<circle; i++)
{
circler_total+=4*(tempN-1);
tempN-=2;
}
p

    =circler_total+(list-circle+1)+(line-circle);
    }
    else
    {
    for(int i=0; i<(circle+1); i++)
    {
    circler_total+=4*(tempN-1);
    tempN-=2;
    }
    p
      =circler_total-(list-circle)-(line-circle-1);
      }
      }
      for(int i=0; i<n; i++)
      cout<<setw(5)<<p[i];
      cout<<"\n\n";

      }
      delete[]p;
      system("pause");
      }


2006-01-19 20:52
注册好难啊
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-1-18
收藏
得分:0 

/*
把矩阵分成几个框
1 2 3 4 1 2 3 4
12 13 14 5 => 12 5 和 13 14
11 16 15 6 11 6 16 15
10 9 8 7 10 9 8 7

方法可能比较笨,但是应该还算直观...

*/
#include <iostream.h>

int CalcStartVal( int startPos, int n ) //计算每个框的初始值(左上角)
{
int startVal = 1;
for ( int i = 0; i < startPos; i++ ){
startVal += ( n + ( n - 2 ) + n + ( n - 2 ) );
n -= 2;
}
return startVal;
}

int CalcStartPosNum( int n ) //计算框数
{
return n / 2 + n % 2;
}

//填充框的上边
void FillTop( int startPos, int startVal, int **theFrame, int n )
{
int end = n - 2 * startPos;
for ( int i =0; i < end; i++ )
theFrame[ startPos ][ startPos + i ] = startVal + i;
}
//填充框的右边
void Fillright( int startPos, int startVal, int **theFrame, int n )
{
int end = n - 2 * startPos - 2;
for ( int i = 0; i < end; i++ )
theFrame[ startPos + i + 1 ][ startPos + end + 1 ]
= startVal + ( end + 2 ) + i;
}
//填充框的下边
void FillBottom( int startPos, int startVal, int **theFrame, int n )
{
int end = n - 2 * startPos;
for ( int i = 0 ; i < end; i++ ){
theFrame[ startPos + end - 1 ][ startPos + end -1 - i ]
= startVal + 2 * end - 2 + i;
}
}
//填充框的左边
void FillLeft( int startPos, int startVal, int **theFrame, int n )
{
int end = n - 2 * startPos - 2;
for ( int i = 0; i < end; i++ )
theFrame[ startPos + end - i ][ startPos ]
= startVal + 3 * ( end + 2 ) -2 + i;
}

//填充一个框
void FillFrame( int startPos, int n, int **theFrame )
{
int startVal = CalcStartVal( startPos, n );
FillTop( startPos, startVal, theFrame, n );
Fillright( startPos, startVal, theFrame, n );
FillBottom( startPos, startVal, theFrame, n );
FillLeft( startPos, startVal, theFrame,n );
}

void main()
{
int n;
cout << "输入N值:" << endl;
cin >> n;
int **matrix = new int*[n];
for ( int i2 = 0; i2 < n; i2++ )
matrix[i2] =new int[n]; //根据输入分配矩阵存储

for ( int i1 = 0; i1 < CalcStartPosNum( n ); i1++ )
FillFrame( i1, n, matrix ); //填充数值

cout << endl ; //显示结果
for ( int i = 0; i < n; i++ ){
for ( int j = 0; j < n; j++ ){
cout << matrix[ i ][ j ];
if ( i == 0 )
cout << " ";
else
cout << " ";
}
cout << endl << endl;
}

for ( i2 = 0; i2 < n; i2++ )
delete [] matrix[i2];
delete [] matrix; //删除指针
}

//O(n^2);没有作输入检查...

2006-01-20 00:18
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 
问一下楼上的,10怎么办?

2006-01-20 09:28
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

我就是按一圈一圈的思路做的,每一圈的个数是 (边长-1)*4个,每圈从左上角开始

先找出数所在的圈的层数,再根据它在圈中的位置,具体算出应该赋给的值,

这些都可以用所在的行列数得出.


2006-01-20 12:38
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
我记得我好象写过一个,找了找,果然在老blog上有

#include <stdio.h>
#include <conio.h>
int a,b,c,d,e,f,t;main(_){!(_-1)&&(d=(e=(f=(c=b=((a=(t=1)+t)*a+t))*a)*a)-f-c+t);_<37&&(t==1?(a+=3,a==e&&(e-=3,t=2)):t==2?(b++,b==f&&(f--,t=3)):t==3?(a-=3,a==c&&(c+=3,t=0)):t==0?(b--,b==d&&(d++,t=1)):0,gotoxy(a,b),printf("%3d",_),_++)&&main(_);}

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-01-20 16:19
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

你写程序总是这种风格?

看不懂


2006-01-20 16:46
快速回复:数组的一个问题
数据加载中...
 
   



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

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