B3621 枚举元组

· · 题解

B3621 枚举元组

前言:

本题解就讲 2 个思路:枚举和 dfs。

但由于我太菜了,4.16 我们的网校才教到 dfs。

所以我现在先提供暴力解法,4.16 更新 dfs。

谢谢大家!

update:4/21 我来更新 dfs 了呜呜。

解法1:枚举:

不懂 dfs 看到这道题的第一思路就是求出 k 进制下的数字。

我们在看一眼这个感人的数据范围:n \leq 5 , k \leq 4

我们就可以用循环轻松的解决这道问题。

if(n==1){
    fore(i,1,k){
        writeln(i);
    }
}
else if(n==2){
    fore(i,1,k){
        fore(j,1,k){
            writesp(i);
            writeln(j);
        }
    }
}
else if(n==3){
    fore(i,1,k){
        fore(j,1,k){
            fore(l,1,k){
                writesp(i);
                writesp(j);
                writeln(l);
            }
        }
    }
}
else if(n==4){
    fore(i,1,k){
        fore(j,1,k){
            fore(l,1,k){
                fore(o,1,k){
                    writesp(i); writesp(j);
                    writesp(l); writeln(o);
                }
            }
        }
        }
    }
else{
    fore(i,1,k){
        fore(j,1,k){
            fore(l,1,k){
                fore(o,1,k){
                    fore(p,1,k){
                        writesp(i); writesp(j);
                        writesp(l); writesp(o);
                        writeln(p);
                    }
                }
            }
        }
    }
}

时间复杂度 O(k^n),看似是一个极其高的复杂度,我们可以来把题目中最高的值带入:

k^n = 4^5 = 1024

解法2:dfs:

我们可以写一个 dfs 函数。

比如说 n=3 , k=3 时:

i 1 2 3 4
a_i 1 ? 未枚举 /

现在枚举到了第 1 位,所以使用 dfs(1+1) 也就是 dfs(2) 来枚举第二位。

dfs 怎么写呢?

if(pos==n+1){
    fore(i,1,n) writesp(a[i]);
    puts("");
    return;
}
fore(i,1,k){
    a[pos]=i;
    dfs(pos+1);
}
signed main(){
    n=read(); k=read();
    dfs(1);
}