給出N個球隊的比賽結果(勝負表),讓排列出來一個“名次表”,保證這個“名次表”中,排在第i位的總是和在排在第i+1位的比賽中勝出
SAMPLE INPUT:4 # +# -+# -+-# |
SAMPLE OUTPUT:1 3 4 2 |
算法就是搜索一下就可以了,很簡單的
代碼:
R=function() return io.stdin:read("*n") end
charAt=function(str,i) return string.sub(str,i,i) end
local n=R()
board,used,win={},{},{}
_=io.read() --讀入空行
for i=1,n do board[i]=io.read() end
for i=1,n do used[i]=false end
for i=1,n do win[i]={} end
for i=1,n do
for j=1,string.len(board[i])-1 do
if charAt(board[i],j)=='+' then
win[i][j],win[j][i]=true,false
else win[i][j],win[j][i]=false,true
end
end
end
ans={}
t=0
function find(k)
if k==1 then
for i=1,n do
used[i]=true
ans[k]=i
if find(k+1) then
return true
end
used[i]=false
end
elseif k>n then
return true
else
for i=1,n do
if not used[i] and win[ans[k-1]][i] then
used[i]=true
ans[k]=i
if find(k+1) then
return true
end
used[i]=false
end
end
end
return false
end
find(1)
print (table.concat(ans,' '))
注意:
1、變量命名時千萬不要起table,雖然不是關鍵字,但是在調用table.concat時就出錯了。。。找了半天。。。
2、table.concat可以引用table中的元素並在每個兩個之間用給定的分割串隔開,效果等同於table[1]..table[2].. …… ..table[n]