永发信息网

程序题 求算法

答案:3  悬赏:0  手机版
解决时间 2021-05-09 21:50
  • 提问者网友:疯孩纸
  • 2021-05-09 16:45
N*N的棋盘,N=5,让你打印输出如下结果:
1 16 15 14 13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
就是环形地递增进去

求最优解,最好有可扩展性,n可以变动
求算法 求经典思路
最佳答案
  • 五星知识达人网友:往事埋风中
  • 2021-05-09 17:47

我前几天刚写了这个,下面是我的代码。


主要思路是用二维数组,方格各边用不同的二维数组递增或递减去赋值。


#include<stdio.h>
#define SIZE 20
int shuzi[SIZE][SIZE];

void ao(int n){
int i=1,j=1,m=1,k=1,p=1,q=n;
while(p<=q*q){
if(m==1){
shuzi[i][j]=p++;
k++;
if(k>n){
m=2;
n--;
k=1;
i++;
}
else
j++;
}
else if(m==2){
shuzi[i][j]=p++;
k++;
if(k>n){
m=3;
k=1;
j--;
}
else
i++;
}
else if(m==3){
shuzi[i][j]=p++;
k++;
if(k>n){
m=4;
n--;
i--;
k=1;
}
else
j--;
}
else if(m==4){
shuzi[i][j]=p++;
k++;
if(k>n){
m=1;
j++;
k=1;
}
else
i--;
}
}
for(i=1;i<=q;i++){
printf("\n");
for(j=1;j<=q;j++)
printf("%4d",shuzi[i][j]);
}
printf("\n");
}

int main(){
int n;
printf("ÇëÊäÈë±ß´óС:");
scanf("%d",&n);
if(n>20||n<=0){
printf("´íÎó!");
return 0;
}
ao(n);
return 0;
}

全部回答
  • 1楼网友:怙棘
  • 2021-05-09 19:10

算法可以是NX2AAS

  • 2楼网友:春色三分
  • 2021-05-09 18:58
递归,函数为 getLine(int N(棋盘长度),int line(要获取的行号),int firstNum第一个数字大小)如果 行号等于1,则返回 firstNum, firstNum + N*4 - 5, firstNum + N*4 - 6.。。。共N个数组成的字符 串如果 行号等于N,则返回firstNum+N-1,firstNum+N,firstNum+N+1。。。共N个数组成 的字符 串。否则 返回 firstNum+行号-1, 以及 getLine(N-1,行号-1,firstNum+N*4-4) 和,firstNum+8+(N-行号)组成的字符 串。 这样在最外层for(i=1...N)循环调用 getLine(N,i,1);并显示返回值就行了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯