100求一个小算法!
/*
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
void func(int n)
要求:通过传入的n,输出一个4*4的矩阵, 顺序如上图所示.
[解决办法]
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
const int N=20;
int i=0,j=0,a[N][N],n;
int m=1,x1,x2,y1,y2,s=1;
//x1,x2,y1,y2为上、下、左、右边界
//s标记数组元素升降,s==1为升,s==-1为降
while(1){
cout < < "\ninput matrix row N(N> =2): ";
cin> > n;
cout < <endl;
if(n> =2)
break;
}
x1=0;y1=0;x2=n;y2=n;
while(1)
{
if(s==1){
for(j;j <y2;j++)
a[i][j]=m++;
j--;i++;y2--;
for(i;i <x2;i++)
a[i][j]=m++;
i--;j--;x2--;
s=-1;
}
else
{
for(j;j> =y1;j--)
a[i][j]=m++;
j++;i--;y1++;
for(i;i> =x1+1;i--)
a[i][j]=m++;
i++;j++;x1++;
s=1;
}
if(m> n*n)
break;
}
for(i=0;i <n;i++){
for(j=0;j <n;j++)
cout < <setw(4) < <setiosflags(ios::left) < <a[i][j];
cout < <endl;
}
cout < <endl;
return 0;
}
[解决办法]
//NXN矩阵
#include <iostream>
using namespace std;
#include <iomanip>
//#define MAXSIZE 4
//全局变量
int value;
void right(); //向左输入的赋值函数
void down();
void left();
void up();
void show(); //显示函数
void sort(); //控制方向的函数
int direction = 0; //控制方向
int rightNum = 0; //向左输入一行的次数
int downNum = 0;
int leftNum = 0;
int upNum = 0;
int arrayNum = 0; //自增赋值数
int row = 0; //保存行下标
int col =0; //保存列下标
int array[100][100]; //保存数组
int main()
{
cin> > value;
sort();
show();
return 0;
}
void sort()
{
//while(arrayNum <= value*value)
//{
while(arrayNum != value*value) //循环跳出条件,赋值完毕
{
switch(direction)
{
case 0:
right();
break;
case 1:
down();
break;
case 2:
left();
break;
case 3:
up();
break;
default:
break;
}
}
return;
}
void right()
{
int m = row;
int n = col;
if(m==0&&n==0)
{
array[m][n] = ++arrayNum;
}
for(int i=n+1; i <value-rightNum;i++)
{
array[m][i] = ++arrayNum;
n++;
}
row=m;
col=n;
rightNum++;
direction = 1;
return;
}
void down()
{
int m = row;
int n = col;
for(int i=m+1; i <value-downNum;i++)
{
array[i][n] = ++arrayNum;
m++;
}
row=m;
col=n;
downNum++;
direction = 2;
return;
}
void left()
{
int m = row;
int n = col;
for(int i=n-1; i> =leftNum;i--)
{
array[m][i] = ++arrayNum;
n--;
}
row=m;
col=n;
leftNum++;
direction = 3;
return;
}
void up()
{
int m = row;
int n = col;
for(int i=m-1; i> upNum; i--)
{
array[i][n] = ++arrayNum;
m--;
}
row=m;
col=n;
upNum++;
direction = 0;
return;
}
void show()
{
int n =0;
for(int i=0; i <value; i++)
{
for(int j=0; j <value; j++)
{
cout < <setw(value) < <array[i][j];
}
cout < <endl;
}
}
[解决办法]
#include <iostream>
#include <string>
using namespace std;
void func(int);
void right(int**,int,int,int&,int);
void down(int**,int,int,int&,int);
void left(int**,int,int,int&,int);
void up(int**,int,int,int&,int);
int main(){
int n;
cout < < "请输入n的值: ";
cin> > n;
func(n);
}
void func(int n){
int** p=new int*[n];
for(int i=0;i <n;i++)
p[i]=new int[n]();//动态分配一个二维数组,初始化为全0
int c=1;
right(p,0,0,c,n);
for(int i=0;i <n;i++){
for(int j=0;j <n;j++){
cout < <p[i][j] < < "\t ";
}
cout < <endl;
}
}
void right(int** p,int i,int j,int& c,int n){
int count=0;
for(;j <n;j++){
if(p[i][j]> 0)
break;//不能再向右继续时跳出循环
p[i][j]=c;
c++;
count++;
}
if(count==0)
return;
down(p,i+1,j-1,c,n);
}
void down(int** p,int i,int j,int& c,int n){
int count=0;
for(;i <n;i++){
if(p[i][j]> 0)
break;//不能再向下继续时跳出循环
p[i][j]=c;
c++;
count++;
}
if(count==0)
return;
left(p,i-1,j-1,c,n);
}
void left(int** p,int i,int j,int& c,int n){
int count=0;
for(;j> =0;j--){
if(p[i][j]> 0)
break;//不能再向左继续时跳出循环
p[i][j]=c;
c++;
count++;
}
if(count==0)
return;
up(p,i-1,j+1,c,n);
}
void up(int** p,int i,int j,int& c,int n){
int count=0;
for(;i> =0;i--){
if(p[i][j]> 0)
break;//不能再向上继续时跳出循环
p[i][j]=c;
c++;
count++;
}
if(count==0)
return;
right(p,i+1,j+1,c,n);
}
[解决办法]
典型的递归问题,不过对于这个小问题,直接写for循环也不错
#include "stdafx.h "
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int dim = 0;
cout < < "请输入n的值: ";
cin > > dim;
if (dim < 1)
return 0;
int* arr = new int[dim*dim];
int pos = 1;
int row = 0;
int col = 0;
int num = 0;
for (int i = 0; i < dim / 2 + 1; i++)
{
num = dim - i*2 - 1;
if (num == 0)
{
row = i;
col = row;
*(arr + row * dim + col) = pos++;
break;
}
// write up
for (int j = 0; j < num; j++)
{
row = i;
col = row + j;
*(arr + row * dim + col) = pos++;
}
// write right
for (j = 0; j < num; j++)
{
row = i + j;
col = dim - i - 1;
*(arr + row * dim + col) = pos++;
}
// write bottom
for (j = 0; j < num; j++)
{
row = (dim - i - 1);
col = row - j;
*(arr + row * dim + col) = pos++;
}
// write right
for (j = 0; j < num; j++)
{
row = dim - i - j - 1;
col = i;
*(arr + row * dim + col) = pos++;
}
}
for (i = 0; i < dim; i++)
{
for (int j = 0; j < dim; j++)
{
printf( "%2d ", *(arr+i*dim+j));
}
printf( "\n ");
}
delete[] arr;
return 0;
}
[解决办法]
/* The following can be compiled and executed in
* visual C++ 6.0 sp6 */
#include "stdio.h "
#define MAX_AM 100
int helixMatrix[MAX_AM][MAX_AM]; // global variable
/*
*(mt_x,mt_y): coordinate of the 1st element
* start:the value of 1st element
* n: the size of the helixMatrix
*/
void SethelixMatrix(int mt_x, int mt_y, int start, int n)
{
int i, j;
if (n <= 0) //the qualification of end for the recursion
return;
if (n == 1)
{ //the extreme size of helixMatrix : 1
helixMatrix[mt_x][mt_y] = start;
return;
}
for (i = mt_x; i < mt_x + n-1; i++) //the top of the matrix
{
helixMatrix[mt_y][i] = start++;
}
for (j = mt_y; j < mt_y + n-1; j++) // the right of it
{
helixMatrix[j][mt_x+n-1] = start++;
}
for (i = mt_x+n-1; i > mt_x; i--) //the bottom of it
{
helixMatrix[mt_y+n-1][i] = start++;
}
for (j = mt_y+n-1; j > mt_y; j--) //the left of it
{
helixMatrix[j][mt_x] = start++;
}
SethelixMatrix(mt_x+1, mt_y+1, start, n-2); // the recursion
}
void main()
{
int i, j;
int n;
printf( " Input the size you want ");
printf( "\n\t ");
scanf( "%d ", &n);
SethelixMatrix(0, 0, 1, n);
//print the helixMatrix
for(i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf( "%4d ", helixMatrix[i][j]);
printf( "\n ");
}
}
//螺旋matrix
[解决办法]
#include <stdio.h>
#define N 4 //fun参数中的n改为这个宏
int main()
{
int i,j,n=1,a[N][N];
for(i=0;i <=N/2;i++)
{
for(j=i;j <N-i;j++)
a[i][j]=n++;
for(j=i+1;j <N-i;j++)
a[j][N-i-1]=n++;
for(j=N-i-2;j> i;j--)
a[N-i-1][j]=n++;
for(j=N-i-1;j> i;j--)
a[j][i]=n++;
}
for(i=0;i <N;i++)
{
printf( "\n\n ");
for(j=0;j <N;j++)
printf( "%5d ",a[i][j]);
}
return 0;
}
[解决办法]
#include <iostream>
#include <iomanip>
using namespace std;
void func(int n){
static const int dir[][2]={{0,1},{1,0},{0,-1},{-1,0}};
const int size=n+2;
int **ver=new int *[size];
for (int i=0;i <size;++i)
{
ver[i]=new int[size];
if (i==0||i==size-1)
{
memset(ver[i],-1,size*sizeof(int));
}
else{
memset(ver[i],0,size*sizeof(int));
ver[i][0]=-1;
ver[i][size-1]=-1;
}
}
int iIndex=0;
int max=n*n;
int cnt=1;
int i=1,j=1;
while (cnt <=max)
{
while (ver[i][j]==0)
{
ver[i][j]=cnt;
i+=dir[iIndex][0];
j+=dir[iIndex][1];
++cnt;
}
i-=dir[iIndex][0];
j-=dir[iIndex][1];
if (cnt> max)
{
break;
}
iIndex=(iIndex+1)%4;
i+=dir[iIndex][0];
j+=dir[iIndex][1];
while (ver[i][j]!=0)
{
iIndex=(iIndex+1)%4;
i+=dir[iIndex][0];
j+=dir[iIndex][1];
}
}
for (int i=1;i <size-1;++i)
{
for (int j=1;j <size-1;++j)
{
cout < <setw(6) < <ver[i][j];
}
cout < <endl;
}
}
int main(){
int n;
cin> > n;
func(n);
}
[解决办法]
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#define m 20
#define h(i,j) ((2*c+2-i)*(i-1)/2+j-i+1) //二维数组中元素在一维数组中的位置
int main()
{
int i=1, j=0, s=0, k, n, c;
int a[m*(m+1)/2+1];
a[1] = 1;
cout < <please input the number < <endl;
cin> > n;
c=n;
while (n> 0)
{
for(k=1;k <=n;k++)
{
j++;
a[h(i,j)] = ++s;
}
n--;//横向赋值
for (k=1; k <=n; k++)
{
i++;
a[h(i,j)] = ++s;
}n--;//纵向赋值
for (k=1;k <=n;k++)
{
j--;
i--;
a[h(i,j)] = ++s;
}
n--;//斜向赋值
}
k=0;
for(i=1;i <=c;i++)
for(j=1;j <=c;j++)
{
if(i> j)
cout < <setw(4) < < "0 ";
else
if(j==c)
{
k++;
cout < <setw(4) < <a[k] < <endl;
}
else
{
k++;
cout < <setw(4) < <a[k];
}
}
return 0;
}
[解决办法]
我这个的输出是这样的:
==========================================
enter x,y
1 2
12
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
Press any key to continue
===========================================
#include <iostream.h>
#include <math.h>
#include <iomanip.h>
int f(int ,int);
int max(int a,int b);
void main()
{
int x,y,t;
cout < < "enter x,y " < <endl;
cin> > x> > y;
cout < <f(x,y) < <endl;
t = max(abs(x),abs(y));
for(int i=-t;i <=t;i++)
{
for(int j=-t;j <=t;j++)
cout < <setw(3) < <f(i,j) < < " ";
cout < <endl;
}
}
int f(int x,int y)
{
int s,s1,e;
s = max(abs(x),abs(y));
s1 =s*2;
e = s1+1;
e = e*e;
if(x==-s)
e = e-s+y;
else if(y==-s)
e = e-3*s-x;
else if(x==s)
e = e-5*s-y;
else
e = e-7*s+x;
return e;
}
int max(int a,int b)
{
return a> b?a:b;
}
[解决办法]
#include <cstdlib>
#include <iostream>
#include <iomanip>
using namespace std;
void fun(int n)
{
int nLeft = 0;
int nTop = 0;
int nRight = n - 1;
int nButtom = n - 1;
int index = 0;
int nArr[n][n];
for (int ix = 0; ix < n; /* empty */) //转圈
{
for (int iy = nLeft; iy <= nRight; ++iy) //先右
{
nArr[nTop][iy] = ++index;
}
++nTop;
for (int iy = nTop; iy <= nButtom; ++iy) //再下
{
nArr[iy][nRight] = ++index;
}
--nRight;
++ix;
for (int iy = nRight; iy > = nLeft; --iy) //再左
{
nArr[nButtom][iy] = ++index;
}
--nButtom;
for (int iy = nButtom; iy > = nTop; --iy) //再上,至此完成一圈
{
nArr[iy][nLeft] = ++index;
}
++ix;
++nLeft;
}
//显示结果
for (int ix = 0; ix != n; ++ix)
{
for (int iy = 0; iy != n; ++iy)
{
cout < <setw(5) < <nArr[ix][iy];
}
cout < <endl;
}
}
int main(int argc, char *argv[])
{
fun(10);
system( "PAUSE ");
return EXIT_SUCCESS;
}
[解决办法]
类似这样~
#define N6
#include <stdio.h>
// ============================================================================
// ==============================================================================
int main()
{
//~~~~~~~~~~~~~~~~~~~~~~~~
int a[N + 2][N + 2] = { 0 };
int x[4] = { 1, 0, -1, 0 };
int y[4] = { 0, 1, 0, -1 };
int i, j, k, f, n = N * N;
//~~~~~~~~~~~~~~~~~~~~~~~~
for (k = 1; k <= N; k++) {
a[0][k] = a[N + 1][k] = a[k][0] = a[k][N + 1] = -1;
}
for (i = k = 1, j = f = 0; k <= n; k++) {
while (a[i + y[f]][j + x[f]]) {
f++;
if (f == 4) {
f = 0;
}
}
i += y[f];
j += x[f];
a[i][j] = k;
}
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
printf( "%5d ", a[i][j]);
}
printf( "\n ");
}
return 0;
}
[解决办法]
#define n 7
void func()
{
int buf[n][n] ={0};
int ret = 0;
for(int i=0; i < (n+1)/2; i++)
{
int off = 2 * i;
for(int x=0; x < n-1 -off ; x++)
buf[i][x+i] = x+1 + ret;
for(x=0; x < n-1- off; x++)
buf[x+i][n-1-i] = (n-1-off) + 1 + x + ret;
for(x=0; x < n-1-off; x++)
buf[n-1-i][x+1+i] = 3*(n-1-off) -x + ret ;
for(x=0; x <n-1-off; x++)
buf[x+1+i][i] = 4*(n-1 -off) -x + ret;
ret = buf[i+1][i];
}
if(n & 1) buf[n/2][n/2] = n * n;
for(i=0; i < n; i++)
{
for(int x=0; x <n; x++)
printf( "%d\t ",buf[i][x]);
printf( "\n ");
}
}
void main()
{
func();
}
------解决方案--------------------
简化:
#define n 7
void func()
{
int buf[n][n] ={0};
int ret = 0;
for(int i=0; i < (n+1)/2; i++)
{
int off = 2 * i;
for(int x=0; x < n-1 -off ; x++)
{
buf[i][x+i] = x+1 + ret;
buf[x+i][n-1-i] = (n-1-off) + 1 + x + ret;
buf[n-1-i][x+1+i] = 3*(n-1-off) -x + ret ;
buf[x+1+i][i] = 4*(n-1 -off) -x + ret;
}
ret = buf[i+1][i];
}
if(n & 1) buf[n/2][n/2] = n * n;
for(i=0; i < n; i++)
{
for(int x=0; x <n; x++)
printf( "%d\t ",buf[i][x]);
printf( "\n ");
}
}
[解决办法]
重新排版:
#define n 7
void func()
{
int buf[n][n] ={0};
int ret = 0;
for(int i=0; i < n/2; i++)
{
int off = 2 * i;
for(int x=0; x < n-1 -off ; x++)
{
buf[i][x+i] = x+1 + ret;
buf[x+i][n-1-i] = (n-1-off) + 1 + x + ret;
buf[n-1-i][x+1+i] = 3*(n-1-off) -x + ret ;
buf[x+1+i][i] = 4*(n-1 -off) -x + ret;
}
ret = buf[i+1][i];
}
if(n & 1) buf[n/2][n/2] = n * n;
for(i=0; i < n; i++)
{
for(int x=0; x <n; x++)
printf( "%d\t ",buf[i][x]);
printf( "\n ");
}
}
[解决办法]
用java写的:
public static void func(int n)
{
int xmax,ymax,xmin,ymin,ivar,jvar;
int[][] s = new int[n][n];
int ci = 1;
jvar = 0;
for(xmax=n,ymax=n,xmin=0,ymin=0;;)
{
for(ivar = xmin;ivar <xmax;ivar++)
{
s[ivar][jvar] = ++ci;
}
ymin++;
ivar--;
for(jvar = ymin;jvar <ymax;jvar++)
{
s[ivar][jvar] = ++ci;
}
xmax--;
jvar--;
for(ivar = xmax-1;ivar> =xmin;ivar--)
{
s[ivar][jvar] = ++ci;
}
ymax--;
ivar++;
for(jvar=ymax-1;jvar> =ymin;jvar--)
{
s[ivar][jvar] = ++ci;
}
xmin++;
jvar++;
if(xmax <=xmin && ymax <=ymin)
break;
}
for(int i=0;i <n;i++)
{
for(int j=0;j <n;j++)
System.out.print(s[i][j] + ", ");
System.out.println( " ");
}
System.out.println( " ");
for(int j=0;j <n;j++)
{
for(int i=0;i <n;i++)
System.out.print(s[i][j] + ", ");
System.out.println( " ");
}
}
[解决办法]
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
//方向
public enum directions {left, right, up, down};
static void Main(string[] args)
{
int length; //数组长度
int seed = 1;//种子
int i = 0; //index i
int j = 0; //index j
Console.WriteLine( "输入一个数 ");
length = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(length.ToString());
int[,] array = new int[length,length];
directions dir = new directions();
dir = directions.right;
//填充数组
while (seed <= length * length)
{
array[i, j] = seed++;
switch (dir)
{
case directions.right:
if (j < length - 1 && array[i, j + 1] == 0)
{
++j;
}
else
{
dir = directions.down;
++i;
}
break;
case directions.down:
if (i < length - 1 && array[i + 1, j] == 0)
{
++i;
}
else
{
dir = directions.left;
--j;
}
break;
case directions.left:
if (j > 0 && array[i, j - 1] == 0)
{
--j;
}
else
{
dir = directions.up;
--i;
}
break;
case directions.up:
if (array[i - 1, j] == 0)
{
--i;
}
else
{
dir = directions.right;
++j;
}
break;
}
}
//输出
for (int ii = 0; ii < length; ++ii)
{
for (int jj = 0; jj < length; ++jj)
{
Console.Write(array[ii, jj].ToString() + " ");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}
[解决办法]
#include <stdio.h>
int a[100][100];
void func(int n)
{
int i=0,x=1,y=1,x1=n,y1=n,x11=1,y11=1;
while(1)
{
for(x;x <=x1;x++){
a[y][x]=++i;
}
x--;
y++;
for(y;y <=y1;y++)
a[y][x]=++i;
y--;
x--;
for(x;x> =x11;x--)
a[y][x]=++i;
x++;
y--;
for(y;y> y11;y--)
a[y][x]=++i;
x++;
y++;
x1--;y1--;x11++,y11++;
if(i==n*n)
break;
}
}
main()
{
int i,j,n;
while(1){
scanf( "%d ",&n);
func(n);
for(i=1;i <=n;i++){
for(j=1;j <=n;j++)
printf( "%4d ",a[i][j]);
printf( "\n ");
}
printf( "\n ");
}
}
[解决办法]
#include <iostream.h>
#define N 10
int a[N][N];
void func(int n)
{
int i,j;
int num = 0;
for (i=0;i <n;i++)
{
for (j=0;j <n;j++)
{
a[i][j] = 0;
}
}
for (i=0;i <n/2+1;i++)
{
for (j=0;j <n;j++)
{
if (a[i][j] == 0)
a[i][j] = ++num;
}
for (j=0;j <n;j++)
{
if (a[j][n-1-i] == 0)
{
a[j][n-1-i] = ++num;
}
}
for (j=n-1;j> =0;j--)
{
if (a[n-1-i][j] == 0)
{
a[n-1-i][j] = ++num;
}
}
for (j=n-1;j> =0;j--)
{
if (a[j][i] == 0)
{
a[j][i] = ++num;
}
}
}
}
int main()
{
int n;
cin> > n;
func(n);
for (int i=0;i <n;i++)
{
for (int j=0;j <n;j++)
{
cout < <a[i][j] < < " ";
}
cout < <endl;
}
return 0;
}
[解决办法]
有些for语句可以合并
#include <iostream>
#include <stdlib.h>
using namespace std;
const int m=6;
int a[m][m];
void CreateResult(int x, int y, int num, int n)
{
if(n==2)
{
a[x][y]= num;
a[x][y+1] = num+1;
a[x+1][y+1] = num+2;
a[x+1][y] = num+3;
return;
}
if(n==1)
{
a[x][y]=num;
return;
}
for(int i=0; i <n; i++)
{
a[x][i+y] = num + i;
a[x+n-1][i+y] = num+ (n-1)*3 - i;
a[i+x][y+n-1] = num+n-1+i;
a[i+x][y] = num+(n-1)*4 - i;
}
a[x][y] = num;
return CreateResult(x+1, y+1, num+4*(n-1), n-2);
}
void ShowResult(int n)
{
for(int i=0; i <n; i++)
{
for(int j=0; j <n; j++)
{
cout < <a[i][j] < < "\t ";
}
cout < <endl;
}
}
int main(int argc, char *argv[])
{
CreateResult(0,0,1,m);
ShowResult(m);
system( "PAUSE ");
return 0;
}