问题描述
由用户输入一个整数(>=1),则形成一个顺时针螺旋递减等差数列矩阵,符合1,2,3…n*n输入数字2,则程序输出:1243输入数字3,则程序输出:123894765输入数字4,则程序输出:12341213145111615610987我们Java老师说问数学老师我们大学数学老师说不会求大师给答案
解决方案
解决方案二:
该回复于2011-04-29 08:33:48被版主删除
解决方案三:
估计你们老师是闲你烦懒得理你没有不敬的意思,这个用最笨的方法是可以实现的
解决方案四:
该回复于2011-04-28 13:09:01被版主删除
解决方案五:
引用2楼wolfkoala的回复:
估计你们老师是闲你烦懒得理你没有不敬的意思,这个用最笨的方法是可以实现的
我们讨论了一个小时没结果不是烦用最笨的方法您求给我看看带图带真相
解决方案六:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassBBB{publicstaticintd;publicstaticvoidmain(String[]args){BBBl=newBBB();System.out.println("请输入一个数:");BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));try{Stringstr=br.readLine();d=Integer.parseInt(str);}catch(NumberFormatExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}int[][]a=newint[d][d];System.out.println("排列:");intn=0;booleanflay=true;while(flay&&n<d){for(inti=n;i<d-n;i++)if(n==0)a[n][i]=i+1;elsea[n][i]=a[n][i-1]+1;flay=l.Chu(a);if(flay==false)break;for(inti=n;i<d-n-1;i++)if(n==0)a[i+1][d-1-n]=i+d+1;elsea[i+1][d-1-n]=a[i][d-1-n]+1;for(inti=n;i<d-n-1;i++)if(n==0)a[d-1-n][i]=a[d-1-n][d-1-n]+d-1-i;elsea[d-1-n][i]=a[d-1-n][d-1-n]+d-1-n-i;flay=l.Chu(a);if(flay==false)break;for(inti=1+n;i<d-n-1;i++)if(n==0)a[i][n]=a[d-1-n][n]+d-1-i;elsea[i][n]=a[d-1-n][n]+d-1-i-n;flay=l.Chu(a);n++;}l.OUT(a);}publicvoidOUT(int[][]a){for(inti=0;i<d;i++){for(intj=0;j<d;j++){System.out.print(a[i][j]+"t");}System.out.println();}}publicbooleanChu(int[][]a){for(inti=0;i<d;i++){for(intj=0;j<d;j++){if(a[i][j]==0)returntrue;}}returnfalse;}}
解决方案七:
兄弟你发了多少次啊给你个c的我以前写的其实就是找规律#include<stdio.h>intjisuan(inti,intj,intn);//计算ij对应数所在的圈数voidmain(){inti,j,circle,n,sign[100];printf("请输入矩阵的阶:");scanf("%d",&n);for(i=0;i<n;i++){sign[i]=1;}//标记数组初始化为“0”for(i=1;i<=n;i++){for(j=1;j<=n;j++){circle=jisuan(i,j,n);if(i!=circle&&(n+1-i)!=circle){if(j==circle)printf("%3d",(2-i+circle-1)+(4*(n-1)*circle-4*circle*(circle-1)));elseprintf("%3d",-(2-i+circle-1)+(4*(n-1)*(circle-1)-4*(circle-2)*(circle-1))+(n-2*(circle-1)+1));}else{if(i==circle)printf("%3d",(j-circle+1)+(4*(n-1)*(circle-1)-4*(circle-2)*(circle-1)));elseprintf("%3d",(-2-j+circle)+3*(n-2*(circle-1))+(4*(n-1)*(circle-1)-4*(circle-2)*(circle-1)));}//sign[circle-1]++;}printf("n");}//函数主体}intjisuan(inti,intj,intn){if(i>n/2)i=n+1-i;if(j>n/2)j=n+1-j;if(j>=i)returni;elsereturnj;}//sign[circle-1]+(4*(n-1)*(circle-1)+2*(circle-1)*(circle-2)))
解决方案八:
请输入一个数:3排列:123894765
解决方案九:
请输入一个数:9排列:123456789323334353637383910315657585960614011305572737475624112295471808176634213285370797877644314275269686766654415265150494847464516252423222120191817
解决方案十:
兄弟上午你发的忘了!
解决方案十一:
这本身就是一个写入的顺序问题,按照螺旋的规律一个一个的写入就是了。其实我在想,我怎么总觉得LZ的结果是顺时针递增的呢。。。
解决方案十二:
你没有跟你的老师解释清楚:java老师让你问数学老师是要你去问她这个算法的思路,也就是让数学老师帮弄一个公式出来,然后根据公式进行转换java
解决方案十三:
importacm.program.ConsoleProgram;publicclassarrayQextendsConsoleProgram{publicvoidrun(){intnum=readInt("pleaseinputanum:");initialTheClass(num);printOut(number);}/***initializetheclass'data*@paramnThenumberofthelinesofthearray*/publicvoidinitialTheClass(intn){number=n;array=newint[n][n];}/**toreturnthedirections(asanint[])ateveryturning*@paramnThenmeansthenumbersofthelinesorrowsofthearray*@returnanarrayaboutthedirections**/privateint[]getDirections(intn){int[]directs=newint[2*n-1];for(inti=0;i<2*n-1;i++){directs[i]=i%4;}returndirects;}/***printouttheoriginalarray*/privatevoidshowTheArray(){println("theoriginalarray:");for(inti=0;i<number;i++){for(intj=0;j<number;j++){print(array[i][j]+"");}print("n");}}/**toprintoutthearrayclockwise*@paramnThenmeansthenumbersofthelinesorrowsofthearray**/publicvoidprintOut(intn){int[]directions=getDirections(n);intdirection=RIGHT;intline=0;introw=0;intnu=1;//需要放进去的数println("thearrayisout:");for(inti=0;i<2*n-1;i++){direction=directions[i];for(intj=0;j<(n-(i+1)/2);j++){array[row][line]=nu++;//每次递增1if(j==(n-(i+1)/2-1)&&i!=2*n-2)//whenitisaturnningdirection=directions[i+1];switch(direction){caseRIGHT:line++;break;caseLEFT:line--;break;caseUP:row--;break;caseDOWN:row++;break;default:break;}}}showTheArray();}/*definethedirectionsasintegertoreference*/privatestaticfinalintRIGHT=0;privatestaticfinalintDOWN=1;privatestaticfinalintLEFT=2;privatestaticfinalintUP=3;privateintnumber;//thenumberofthelinesorrowsprivateint[][]array;}//原来写的一个用于那样顺时针螺旋输出的程序,给改了改。LZ看看吧。与数学有关的就是个数的拆分,比如36可以拆成6+5+5+4+4+3+3+2+2+1+1,拆出来的数字的个数也就是上述程序中拐点(turing处)的个数。这样应该明白了吧?
解决方案十四:
packagetest;publicclassTest{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubintn=5;intmatrix[][]=newint[n][n];finalintDIRECTION_R=1;finalintDIRECTION_D=2;finalintDIRECTION_L=3;finalintDIRECTION_U=4;intdir=DIRECTION_R;inti=0,j=0;for(intcnt=1;cnt<=n*n;){matrix[i][j]=cnt++;switch(dir){caseDIRECTION_R:if(j+1>=n||matrix[i][j+1]!=0){dir=DIRECTION_D;i++;}else{j++;}break;caseDIRECTION_D:if(i+1>=n||matrix[i+1][j]!=0){dir=DIRECTION_L;j--;}else{i++;}break;caseDIRECTION_L:if(j-1<0||matrix[i][j-1]!=0){dir=DIRECTION_U;i--;}else{j--;}break;caseDIRECTION_U:if(i-1<0||matrix[i-1][j]!=0){dir=DIRECTION_R;j++;}else{i--;}break;default:continue;}}for(intii=0;ii<n;ii++){for(intjj=0;jj<n;jj++){System.out.print(matrix[ii][jj]+"t");}System.out.println();}}}
解决方案十五:
publicclassTest{/*<summary>用数组来保存最终结果。point:以一周为一个循环,从1到x*x顺时针依次赋值,每次循环的最大行号和列号以及最小行号和列号是相等的。<summary>*/publicstaticvoidmain(Stringargs[]){intx=1;//初始递增量inta=8;//初始输入值int[][]result=newint[a][a];intmin=0;//最小行和列intmax=a-1;//最大行和列while(x<=a*a){introw=min;//行intcol=min;//列for(;col<=max&&x<=a*a;col++){result[row][col]=x++;}row=row+1;col=max;for(;row<=max&&x<=a*a;row++){result[row][col]=x++;}col=col-1;row=max;for(;col>=min&&x<=a*a;col--){result[row][col]=x++;}row=row-1;col=min;for(;row>min&&x<=a*a;row--){result[row][col]=x++;}min++;max--;}//输出结果for(inti=0;i<a;i++){for(intj=0;j<a;j++){System.out.print(result[i][j]+"t");}System.out.println();}}}此方法属于最基本的笨办法,基本满足了楼主的需要,希望对楼主有所帮助,期待下面能有更好的答案!
解决方案:
publicclassSpiralMatrix{publicfinalstaticintDOWN_FIRST=0;publicfinalstaticintRIGHT_FIRST=1;publicstaticvoidmain(String[]args){finalintN=9;finalintDIRECT=RIGHT_FIRST;int[][]spiralMatrix=newint[N][N];int[]rc={0,0};for(intc=0,n=1,t=(N<<1)-1;c<t;){intp=(c+1)>>1;while(p++<N){spiralMatrix[rc[0]][rc[1]]=n++;if(p==N){c++;}rc[(c&1)^DIRECT]+=1-(c&2);}}output(spiralMatrix);}privatestaticvoidoutput(int[][]matrix){for(inti=0;i<matrix.length;i++){for(intj=0;j<matrix[i].length;j++){if(j>0){System.out.print('');}System.out.printf("%2d",matrix[i][j]);}System.out.println();}}}123456789323334353637383910315657585960614011305572737475624112295471808176634213285370797877644314275269686766654415265150494847464516252423222120191817
解决方案:
引用5楼a19880905的回复:
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassBBB{publicstaticintd;publicstaticvoidmain(String[]args){BBBl=newBBB();……
您这也太分了吧
解决方案:
该回复于2011-04-29 09:47:03被版主删除
解决方案:
其实你可以这样思考:第一个圈:1234567893210311130122913281427152616252423222120191817第二个圈333435363738395640554154425343524451504948474645下面类似...
解决方案:
packagetest.questions.some;importstaticjava.lang.System.out;importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassOne{//前进方向(1:→2:↓3:←4:↑)privatestaticintdirection=1;privatestaticfinalintRIGHT=1;privatestaticfinalintDOWN=2;privatestaticfinalintLEFT=3;privatestaticfinalintUP=4;publicstaticvoidmain(String[]args)throwsException{out.println("请输入一个大于1的正整数!");intind=0;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));ind=Integer.parseInt(in.readLine());int[][]a=newint[ind][ind];a[0][0]=1;int[]b={0,0};//逐个设置下一个节点的值for(inti=0;i<ind*ind-1;i++){b=setNextNode(a,b[0],b[1]);}//打印数组for(inti=0;i<a.length;i++){int[]k=a[i];for(intj=0;j<k.length;j++){out.print(k[j]+"");}out.println();}}/***获取当前节点的下一个递增节点坐标**@paramarray*当前数组*@paramx*当前节点横坐标*@paramy*当前节点纵坐标*@return下一个递增节点的坐标*/privatestaticint[]setNextNode(int[][]array,intx,inty){int[]next={x,y};booleanchange=false;//true:改变前进方向,false:按当前方向前进。try{switch(direction){caseRIGHT://1:→if(array[x][y+1]>0){change=true;}else{array[x][y+1]=array[x][y]+1;next[1]=y+1;}break;caseDOWN://2:↓if(array[x+1][y]>0){change=true;}else{array[x+1][y]=array[x][y]+1;next[0]=x+1;}break;caseLEFT://3:←if(array[x][y-1]>0){change=true;}else{array[x][y-1]=array[x][y]+1;next[1]=y-1;}break;caseUP://4:↑if(array[x-1][y]>0){change=true;}else{array[x-1][y]=array[x][y]+1;next[0]=x-1;}default://donothing}}catch(ArrayIndexOutOfBoundsExceptione){change=true;}if(change){direction++;if(direction>4)direction=1;//改变方向之后设置下一个节点的值next=setNextNode(array,x,y);}returnnext;}}
解决方案:
该回复于2011-05-12 09:07:38被版主删除