日期:2014-05-16  浏览次数:20403 次

【大神们求算法!!】
n = 1 得出:

1

n = 2 得出:

1 2
4 3

n = 3 得出:

7 8 9
6 1 2
5 4 3

n = 4 得出:

7  8  9  10
6  1  2  11
5  4  3  12
16 15 14 13

n = 5 得出:

21 22 23 24 25
20 7  8  9  10
19 6  1  2  11
18 5  4  3  12
17 16 15 14 13

大神应该明白吧,就是n*n个数环绕排出来的距形

------解决方案--------------------
是啊,就是一圈一圈,然后把圈拆分了,每个圈拆成4步,然后就是找规律了。

你看这个示意图,分下n为奇偶,按照“红-紫-黄-绿”的顺序走就行了。



麻烦点的,可以根据上图的规律,一圈圈回填,找好规律就行。

当n为偶数,一共绕n/2圈,每圈分四步,第i圈的步长是2*i-1。
当n为奇数,去除中心的1不算,一共绕(n-1)/2圈,每圈分四步,第i圈的步长是2*i。
------解决方案--------------------

<script>
function getJz(n){
var jz=new Array;
for(var i=0;i<n;i++){
var tmp=new Array;
for(var j=0;j<n;j++){
tmp[j]=0;
}
jz[i]=tmp;
}
//alert(jz);
if(n%2==0){
var x=n-1;
var y=0;
var direct='r';
}else{
var x=0;
var y=n-1;
var direct='l';
}
var start=n*n;
for(var i=start;i>0;i--){
if(jz[x][y]==0){
var tmp_x=x;
var tmp_y=y;
}else{
if(direct=='l'){
if(y-1>=0&&jz[x][y-1]==0){
y--;
}else{
direct='d';
}
}
if(direct=='d'){
if(x+1<n&&jz[x+1][y]==0){
x++;
}else{
direct='r';
}
}
if(direct=='r'){
if(y+1<n&&jz[x][y+1]==0){
y++;
}else{
direct='u';
}
}
if(direct=='u'){
if(x-1>=0&&jz[x-1][y]==0){
x--;
}else{
direct='l';
if(y-1>=0&&jz[x][y-1]==0){
y--;
}else{
direct='d';
}
}
}
}
tmp_x=x;
tmp_y=y;
jz[tmp_x][tmp_y]=i;
}
document.write('<table border=1>');
for(var i=0;i<n;i++){
document.write('<tr id=tr'+i+'>');
for(var j=0;j<n;j++){
document.write('<td id=td'+jz[i][j]+'>'+jz[i][j]+'</td>');
}
document.write('</tr>');
}
document.write('</table>');
}
getJz(6);
getJz(5);
</script>

------解决方案--------------------
经过分析我觉得棒棒糖其实只有两种情况:
如图红箭头是n为偶数时:只要在每行最后增加一个数,数的大小从(n-1)*(n-1)+1开始;然后增加一行,数字是继前面的数值增加。
黄色箭头是n为奇数时:只要在每行前面增加一个数,数是从下向上的,大小也是从(n-1)*(n-1)+1开始;然后在最上面增加一行。
我们把这个表格用二维数组表示,解决起来就简单了。