/*
实现效果:
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列的
1.简介:
----------------------------------
本软件是本人为毕业设计所作。所编译的汇编代码数据均为16位,而且用
了较的伪指令,所以需要 MASM 6.1以上版才能通过编译,但是能够较好支持各
类数学、逻辑、递归操作,但是对数组支持仍然不理想。
2.使用说明:
----------------------------------
本软件可以对 C minus 程序进行词法分析、语法分析、语义分析以及汇编
代码生成,带有较友好的IDE界面,使您能够很轻松的完成对源程序的各种编辑
操作,而且很直观的看到程序的错误等等。其中语义分析和语法错误作的不是很
好,一个简单的错误,比如少括号,分号,可能会引发一系列莫名其妙的错误,
这个是错误关联,只要修正第一个词法或语法错误即可,很多编译器都有这个弊
端,这个也不例外了!!
其中使用第三方插件 SynEdit, 可以支持 C/C++程序源代码的编辑,带有
高亮语法显示,很容易让你纠正一些基本错误!颜色搭配是我自己修改的,仿照
开源的 DEV-CPP,并且程序界面也参考了一些。
3.版本历史:
----------------------------------
2006.03.16 重新构架,放弃核心编译部分的DLL, 采用C++重新编写,
实现词法分析功能。标识符名称增加下划线 '_',
并且支持C++风格注释 '//'。
并且对 C minus 语法进行扩充。
2006.04.05 顺利完成语法分析。
2006.04.20 完成语义分析,符号表生成。
2006.04.28 初等汇编代码框架实现;
2006.05.15 实现完整汇编代码,完成所有测试以及帮助文档。开发结束!