/*
实现效果:
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
*/
#include <stdio.h>
#define N 5 //阶数,即N*N的螺旋矩阵
void main()
{
int i, j, num=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++)
{
for(j=0; j<N; j++)
printf("%2d ",a[i][j]);
printf("\n");
}
}
不知道叫什么,先叫它“回宫图”吧
年初的时候在贴吧瞎逛,看到了一个程序挺有意思,会输出如下的形状:
01 24 23 22 21 20 19
02 25 40 39 38 37 18
03 26 41 48 47 36 17
04 27 42 49 46 35 16
05 28 43 44 45 34 15
06 29 30 31 32 33 14
07 08 09 10 11 12 13
仔细看这个形状,数字是按顺序往里回旋的,觉得很有创意,可是一看源代码头就大了,
每个编程人都知道看别人的代码是很困难的,尤其像这种不知道思路的,所以也就放下
没管了。
昨天上物理课实在是没心思听,就想起这个程序,想了一节课,果然不负有心人,给弄出来了,这个是增强版的,可以输入1-10中的任意个数,然后生成图形。
先看代码,没有注释,所以不好看的懂。
#include<stdio.h>
main()
{
int n,m,i,j,t,k=1;
int a[11][11];
clrscr();
do{
printf("please input a number(1-10):");
scanf("%d",&n);
}while(n<1||n>10);
t=n+1;
for(m=1;m<=t/2;m++)
{
for(i=m;i<=t-m;i++)
{a[i][m]=k;k++;}
for(j=m+1;j<=t-m;j++)
{a[i-1][j]=k;k++;}
for(i=n-m;i>=m;i--)
{a[i][j-1]=k;k++;}
for(j=n-m;j>=m+1;j--)
{a[i+1][j]=k;k++;}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]<=9) printf("0%d ",a[i][j]);
else printf("%d ",a[i][j]); }
printf("\n");
}
getch();
}
就是这样的。
可以更简洁些:
#include<stdio.h>
main()
{
int n,m,i,j,t,k=1;
int a[11][11];
clrscr();
do{
printf("please input a number(1-10):");
scanf("%d",&n);
}while(n<1||n>10);
t=n+1;
for(m=1;m<=t/2;m++)
{
for(i=m;i<=t-m;i++)
a[i][m]=k++;
for(j=m+1;j<=t-m;j++)
a[i-1][j]=k++;
for(i=n-m;i>=m;i--)
a[i][j-1]=k++;
for(j=n-m;j>=m+1;j--)
a[i+1][j]=k++;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]<=9) printf("0%d ",a[i][j]);
else printf("%d ",a[i][j]); }
printf("\n");
}
getch();
}
#include <stdio.h>
#define N 8
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]);
}
}
马踏棋盘问题
#include <stdio.h>
#define N 5
void main(){
int x,y;
void horse(int i,int j);
printf("Please input start position:");
scanf("%d%d",&x,&y);
horse(x-1,y-1);
}
void horse(int i,int j){
int a[N][N]={0},start=0,
h[]={1,2,2,1,-1,-2,-2,-1},
v[]={2,1,-1,-2,2,1,-1,-2},
save[N*N]={0},posnum=0,ti,tj,count=0;
int jump(int i,int j,int a[N][N]);
void outplan(int a[N][N]);
a[i][j]=posnum+1;
while(posnum>=0){
ti=i;tj=j;
for(start=save[posnum];start<8;++start){
ti+=h[start];tj+=v[start];
if(jump(ti,tj,a))
break;
ti-=h[start];tj-=v[start];
}
if(start<8){
save[posnum]=start;
a[ti][tj]=++posnum+1;
i=ti;j=tj;save[posnum]=0;
if(posnum==N*N-1){
//outplan(a);
count++;
}
}
else{
a[i][j]=0;
posnum--;
i-=h[save[posnum>;j-=v[save[posnum>;
save[posnum]++;
}
}
printf("%5d",count);
}
int jump(int i,int j,int a[N][N]){
if(i<N&&i>=0&&j<N&&j>=0&&a[i][j]==0)
return 1;
return 0;
}
void outplan(int a[N][N]){
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%3d",a[i][j]);
printf("\n");
}
printf("\n");
//getchar();
}
用回溯法得到所有的解,但效率较低,只能算出5行5列的