一个c语言题目,程序怎么写,完全没有思路
发布网友
发布时间:2023-09-03 00:55
我来回答
共3个回答
热心网友
时间:2024-12-01 19:57
开一个NxN二维数组(足够大),往里面顺时针螺旋式填数,然后把数组中的数打印出来就完成了。
顺时针螺旋式填数的办法:顺时针边界行走。数组先填全0,定义边界宽度为所输入的数,然后从0行0列开始,向右按增加列号依次填数,直到到达边界(比如输入5,边界就是4),然后固定列号不变,按行增加填数,到达列边界再固定行号减小列号填数,再按减小行号填数...,如果遇到边界已经填数(不为0),则由行列填写转换。如此直到填完。
热心网友
时间:2024-12-01 19:57
#include <stdio.h>
#include <stdlib.h>
int main()
{
for (;;) {
int i,start,l,r,N,*metrix;
printf("input N:");
scanf("%d",&N);
/*alloc memory*/
metrix = (int *)malloc(N*N*sizeof(int));
start = 1;
/*asign in circle*/
for (i = 0;i < (N+1)/2; i++) {
int left,top,right,bottom,x,y;
left = i;
top = i;
right = N - i - 1;
bottom = N- i -1;
/*top*/
for (x=left;x<=right;x++) {
metrix[top*N+x]=start++;
}
/*right*/
for (y=top+1;y<bottom;y++) {
metrix[y*N+right]=start++;
}
/*bottom*/
for (x=right;x>left;x--) {
metrix[bottom*N+x]=start++;
}
/*left*/
for (y=bottom;y>top;y--) {
metrix[y*N+left]=start++;
}
}
/*printf*/
for (l = 0;l < N;l++) {
for (r =0 ;r < N;r++) {
printf("%4d ",metrix[l*N+r]);
}
printf("\n");
}
printf("\n");
free(metrix);
}
return 0;
}
大致是先计算多少圏,然后一圏一圏模拟
热心网友
时间:2024-12-01 19:58
C++版的,用比较普通的方法模拟了一下。。四个方向不同走一遍即可。
#include <iostream>
using namespace std;
int ans[100][100];
int main() {
int n=5;
int num=1;
int x=0,y=0;
int j=0;
cin>>n;
for(int i=n-1;i>=0;i=i-2)
{
cout<<i<<endl;
for(j=0;j<i;j++)
{
ans[x][y+j]=num;
num++;
}
y=y+i;
for(j=0;j<i;j++)
{
ans[x+j][y]=num;
num++;
}
x=x+i;
for(int j=0;j<i;j++)
{
ans[x][y-j]=num;
num++;
}
y=y-i;
for(int j=0;j<i;j++)
{
ans[x-j][y]=num;
num++;
}
x=x-j;
x++;y++;//向里递进一层
}
if(n%2!=0)//奇数层中心特判
ans[n/2][n/2]=num;
for(int i=0;i<n;i++)
{
cout<<endl;
for(int j=0;j<n;j++)
cout<<ans[i][j]<<" ";
}
return 0;
}