#include<iostream> using namespace std; int next[1000005]; int main(){ int n,m; cin>>n>>m;//输入n、m for(int i=0;i<n;i++)//初始化 next[i]=i+1; next[n]=1; int p=0; for(int i=1;i<=n;i++){//开始模拟出圈过程 for(int j=1;j<m;j++) p=next[p];//p位置右移 cout<<p[next]<<" ";//输出出圈人的位置 next[p]=next[next[p]];//删掉出圈人 } return 0;用python}
时间: 2024-04-23 22:23:27 浏览: 86
这段代码是用 C++ 编写的,实现了约瑟夫问题的求解。约瑟夫问题是这样一个问题:有 n 个人围成一圈,从第一个人开始报数,数到 m 的人出圈,然后从出圈的人的下一个人开始重新报数,直到剩下最后一个人。这段代码用了一个数组 next 来模拟这个过程,p 表示当前报数的人的位置,每次数到第 m 个人就将该人的位置从数组中删除,并将指针 p 指向下一个人。最后输出所有出圈人的位置。
相关问题
#include <algorithm> #include <iostream> using namespace std; int main() { int n; cin >> n; int* c = new int[n]; for (int i = 0; i < n; i++) cin >> c[i]; sort(c, c + n); do { for (int i = 0; i < n; i++) cout << c[i]<<" "; cout << endl; } while (next_permutation(c, c + n)); return 0; }不用do while怎么写
可以使用递归的方式来实现全排列,具体实现如下:
```
#include <algorithm>
#include <iostream>
using namespace std;
void permutation(int* arr, int start, int end)
{
if(start == end)
{
for(int i = 0; i <= end; i++)
cout << arr[i] << " ";
cout << endl;
}
else
{
for(int i = start; i <= end; i++)
{
swap(arr[start], arr[i]);
permutation(arr, start+1, end);
swap(arr[start], arr[i]);
}
}
}
int main()
{
int n;
cin >> n;
int* arr = new int[n];
for(int i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n);
permutation(arr, 0, n-1);
delete[] arr;
return 0;
}
```
这个程序与之前的程序有很大的相似性,只是将do-while循环改为了递归函数。程序先对输入的元素进行排序,然后调用递归函数permutation来进行全排列。递归终止条件是只剩下一个元素时,直接输出即可。
#include <iostream> #include <algorithm> #include <cstring> #include <map> using namespace std; int ans; map<string, string> mp; int main() { string tmp; cin >> tmp; for (int i = 0; i < tmp.size() - 7; i ++) { string str = ""; for (int j = i; j < i + 8; j ++) str += tmp[j]; mp[str] = str; } int n; cin >> n; while(n --) { string s; cin >> s; sort(s.begin(), s.end()); do if(mp.count(s)) ans ++; while(next_permutation(s.begin(), s.end())); } cout << ans << endl; return 0; }解释
这段代码实现的是一个密码匹配功能。具体实现步骤如下:
1.读入一个字符串tmp,将其所有长度为8的子串存储到一个map中。这里使用了两层循环,外层循环i从0到tmp.size()-7,内层循环j从i到i+7,将tmp中从i到i+7的子串存储到map中。
2.读入一个整数n,表示后面还有n个字符串需要匹配。
3.进入一个while循环,循环n次。每次循环中,读入一个字符串s,将其排序后,通过枚举其所有排列,检查是否在之前存储的map中出现过。如果出现过,将答案ans加1。
4.最后输出ans即为答案。
这段代码的核心思想是将所有长度为8的子串存储到一个map中,然后通过排序和枚举排列的方法来匹配输入的字符串。时间复杂度为O(n*8!*log(8!)),其中n为输入的字符串个数。
阅读全文