天上共有n颗星星排成一排,小强坐在草地上数星星,但是直接一颗一颗数实在是太无聊了,因此小强规定自己第数的星星不能是第ai颗,现在他想知道在他的限制之下还有多少种数星星的方案。(两种方案不同当且仅当两种方案存在至少—次数的星星不是同一颗)
输入描述:
第一行数字n表示星星的个数。
接下来一行n个数字表示不能数的星星编号。
1<n<10^7
eg:
2
1 2 3
输出描述:
2 3 1
3 1 2
看到题目首先想到的就是全排列,然后去掉不符合条件的。下面代码随便写的,不知道在牛客上可以通过多少的测试用例。在本地上运行都可以通过。但是数据量太大也许会超时。
//数星星
function countSatr(n,arr){
let res = [];
let nums = [];
for(let i=1;i<=n;i++){
nums.push(i);
}
var _generate = function(oriNums,tempArr){
let len = tempArr.length;
if(len){
if(tempArr[len-1] == arr[len-1]){
return;
}
}
if(len == n){
res.push(tempArr);
return;
}
for(let i=0;i<oriNums.length;i++){
let t = [...tempArr,oriNums[i]];
let o = oriNums.slice(0,i).concat(oriNums.slice(i+1));
_generate(o,t);
}
}
_generate(nums,[]);
return res;
}
console.log(countSatr(4,[1,2,3,4]))
//没做输入输出的处理,写在这里
输入
let n = parseInt(readline());
let arr = readline().split(' ').map(item => +item)
输出
console.log(res)