给出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]