package main
import (
"fmt"
"math"
"os"
"strconv"
)
/**
思路:
蜷缩问题:
如图,根据步长和方向走:"→","↓","←","↑"
1 2 3
8 9 4
7 6 5
分析:
按照1的步长前进
但是在二维数组中分析,是先按行以步长为1前进,然后按步长为阶数前进,再步长为1前进,再步长为阶数前进
解决的问题:
1、总共需要走几次(用for循环)
2、每一次走几步
3、每一步步长
一维替代二维数组
*/
func main() {
var inputn int=4 //阶数初始化
var findval int=0 //寻找值初始化
if len(os.Args)>=2{
inputn,_=strconv.Atoi(os.Args[1])
findval,_=strconv.Atoi(os.Args[2])
}
ccc:=int(math.Pow(float64(inputn),2)) //总的数量
intarr:=make([]int,ccc,ccc) //创建一维数组容纳
var sumcnt int=0
posnum:=1 //计数器,用于产生序列
zuobiao:=0 //坐标,初始为0
//每一圈需不包含左右两肩,所以减2
for quan,cheng:=inputn-2,1;quan>-2;cheng++{
thiscnt:=quan*4+4 //每一轮需要走的步数,因为是正方形,所以走不重复的圈数是层数*4+4
sumcnt+=thiscnt
if thiscnt==0{
thiscnt=ccc-sumcnt
}
//fmt.Printf("第%d层有%d开始于%d\n",cheng,thiscnt,zuobiao)
firstlen:=int(inputn)-2*(cheng-1) //每一圈的首行步数
//firstlen:=quan+1
var rrlen [] int=[]int {firstlen,firstlen-1,firstlen-1,firstlen-2} //每一圈的步数
//fmt.Printf("%v\n",rrlen)
//var arrflag [] string=[] string{"2right","2down","2left","2up"} //方向
//var ss[] string=[] string{"→","↓","←","↑"}
var arrcnt int=1 //走第几步
//记住上次的坐标就行了
buchangdanwei,buchang:=0,0 //步长单位、步长
for lll := range rrlen{
if lll%2==0{
buchangdanwei=1 //向右和向左单位是1
}else{
buchangdanwei=inputn //向上和向下步长是阶数
}
//向右和向下步长系数是1,向左和向上是-1
if lll<2{
buchang=buchangdanwei
}else{
buchang=-1*buchangdanwei
}
//实际填充一维数组数据
for ij:=0;ij<rrlen[lll];ij++{
//第一步走:cheng*ij 第二步走:(ij+1)*firstlen 第三部走:postxy-ij 第四部公式:
//fmt.Printf("%d:%d,%s:%d\t",posnum,zuobiao,ss[lll],buchang)
//fmt.Printf("%s%d\t",ss[lll],buchang)
zuobiao+=buchang
intarr[zuobiao-1]=posnum
//fmt.Printf("zuobiao:%d,buchang:%d,intarr[%d]:%d\n",zuobiao,buchang,zuobiao,posnum)
posnum++
}
arrcnt++
//fmt.Printf("打印[%d]\n",rrlen[lll])
}
if sumcnt > ccc{
break
}
quan-=2
}
arrmap:=make(map[int]int,ccc)
for i:=0;i<int(ccc);i++{
if i>0 && i%int(inputn)==0{
fmt.Println()
}
arrmap[intarr[i]]=i
//fmt.Printf("R%dC%d:%d\t",i/inputn,i%inputn,intarr[i]) //正常数组坐标
fmt.Printf("R%dC%d:%d\t",i/inputn+1,i%inputn+1,intarr[i]) //从1开始的坐标
}
fmt.Println()
fmt.Printf("findvalue:%d,posxy:R[%d]C[%d]\n",findval,arrmap[findval]/inputn+1,arrmap[findval]%inputn+1)
fmt.Println("game over")
}