这次的程序改写了putCell方法,递归出所有合法的摆放可能, 打印出来,还没有剪支。还没想到怎么剪枝。 加上了一个FindNext的方法,把矩阵当做数组类似处理。 def printSquare(square): for i in range(0,len(square)): print square[i]; def putGun(row,column): Square[row][column]='x'; def fromLeftShoot(row,column): for i in range(column,-1,-1): if Square[row][i]==1: return 0; elif Square[row][i]=='x': return 1; return 0; def fromRightShoot(row,column): for i in range(column,ColumnNum): if Square[row][i]==1: return 0; elif Square[row][i]=='x': return 1; return 0; def fromUpShoot(row,column): for i in range(row,-1,-1): if Square[i][column]==1: return 0; elif Square[i][column]=='x': return 1; return 0; def fromDownShoot(row,column): for i in range(row,RowNum): if Square[i][column]==1: return 0; elif Square[i][column]=='x': return 1; return 0; def canBeShoot(row,column): fromLeft=fromLeftShoot(row,column); fromRight=fromRightShoot(row,column); fromUp=fromUpShoot(row,column); fromDown=fromDownShoot(row,column); if fromLeft or fromRight or fromUp or fromDown: return 1; else: return 0; def checkCanPutGun(row,column): if Square[row][column]==1: return 0; elif canBeShoot(row,column): return 0; else: return 1; class gunPos:pass; def removeLastCell(): if len(ArrangedList)>0: node=ArrangedList.pop(); Square[node.row][node.column]=0; return node; def FindNext(row,column): pos=gunPos(); pos.row=row; pos.column=column; if column<ColumnNum-1: pos.column=column+1; elif row<RowNum-1: pos.row=row+1; pos.column=0; else: pos=None; return pos; def putCell(row, column): node=None; if FindNext(row,column)==None: #printSquare(Square); print(len(ArrangedList)) node=removeLastCell(); if FindNext(row,column)!=None: if checkCanPutGun(row,column): gun=gunPos(); gun.row=row; gun.column=column; ArrangedList.append(gun); putGun(row,column); if node==None: next=FindNext(row,column); if next!=None: putCell(next.row,next.column); else: next=FindNext(node.row,node.column); if next!=None: putCell(next.row,next.column); ArrangedList=[]; ColumnNum=4 RowNum=4 Square=[[0 for a in range(ColumnNum)] for b in range(RowNum)] GunPositionList=[]; Square[0][1]=1 Square[2][1]=1 Square[2][0]=1 putCell(0,0); #printSquare(Square);