A 老子的全排列呢
DFS解决全排列问题
#include <iostream>
using namespace std;
int res[110];//结果数组
int vis[110];//标记数组
void dfs(int step)//step表示当前深搜到第几个数字
{
if (step == 9)//到达边界
{
for (int i = 1;i <= 7;i++) cout << res[i] << " ";
cout << res[8];
cout << endl;//换行
return;//回溯
}
for (int i = 1;i <= 8;i++)
{
if (vis[i] == 0)
{
res[step] = i;//把枚举的数字放入当前的位置
vis[i] = 1;//修改标记数组
dfs(step + 1);
vis[i] = 0;//恢复现场
}
}
}
int main()
{
dfs(1);//从第一个数字开始搜索
return 0;
}
C 牛牛的三角形
暴力搜索
#include <iostream>
using namespace std;
int a[110];
int main()
{
int n;
cin >> n;
int flag = 0;//flag为0表示未找到满足条件的数
for (int i = 0;i < n;i++) cin >> a[i];
for (int i = 0;i < n;i++)//暴力搜索
{
for (int j = i + 1;j < n;j++)
{
for (int k = j + 1;k < n;k++)
{
if (a[i] + a[j] > a[k] && a[i] + a[k] > a[j] && a[k] + a[j] > a[i])
{
flag = 1;//找到满足条件的数,将flag修改为1
cout << a[i] << " " << a[j] << " " << a[k];
return 0;
}
}
}
}
if (flag == 0) cout << "No solution" << endl;
return 0;
}
E 好串
栈
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
char a[60];
int main()
{
stack<char> st;
scanf("%s",a);
int len = strlen(a);
for (int i = 0;i < len;i++)
{
if (a[i] == 'a') st.push(a[i]);
else if (a[i] == 'b' && st.empty()) st.push(a[i]);
else if (a[i] == 'b' && st.top() == 'a') st.pop();
}
if (!st.empty()) cout << "Bad" << endl;
else cout << "Good" << endl;
return 0;
}
F Rails
题目大意:判断给出的序列是否是正确的出栈序列
举例:如果输入序列为1234,判断1324是不是一个合法的出栈序列
思路:
- 用一个数组a[0,1,2,3]来存储需要判断的序列
- a[0] = 1,a[1] = 3,a[2] = 2,a[3] = 4
- 将1入栈,并且与a[0]比较,发现1 == a[0],则1出栈
- 将2入栈,并且与a[1]比较,发现2 ! = a[1]
- 将3入栈,并且与a[1]比较,发现3 == a[1],则3出栈
- 将栈顶元素2与a[2]比较,发现2 == a[2],则2出栈
- 将4入栈,并且与a[3]比较,发现4 == a[3],则4出栈
- 此时栈空,则表示1324是一个合法的序列
#include <iostream>
#include <stack>
using namespace std;
const int N = 1010;
int a[N];//用来存储需要判断的序列
int main()
{
int n;
while (cin >> n && n)
{
//当输入的序列首元素为0时停止输入
while (cin >> a[0] && a[0])
{
for (int i = 1;i < n;i++) cin >> a[i];
stack<int> st;
int index = 0;//用来访问需要判断的序列的下标
for (int i = 1;i <= n;i++)
{
st.push(i);
while (!st.empty() && st.top() == a[index])
{
st.pop();
index++;
}
}
if (st.empty()) cout << "Yes" << endl;
else cout << "No" << endl;
}
cout << endl;//每组数据输入完之后需要换行
}
return 0;
}
H 吐泡泡
栈
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
using namespace std;
char c[110];
int main()
{
stack<char> st;
while (~scanf("%s",c))//数据有多组
{
int len = strlen(c);
for (int i = 0;i < len;i++)
{
if (st.empty()) st.push(c[i]);//若栈空,则直接入栈
else if (!st.empty())//若栈不空,分类讨论
{
if (st.top() == 'O' && c[i] == 'O') st.pop();//两个大O则出栈
else if (st.top() == 'O' && c[i] == 'o') st.push(c[i]);//一大O一小o则入栈
else if (st.top() == 'o' && c[i] == 'O') st.push(c[i]);//一小o一大O则入栈
else if (st.top() == 'o' && c[i] == 'o')//两个o变O
{
st.pop();
if (!st.empty() && st.top() == 'O') st.pop();//弹出小o之后栈顶是大O
else st.push('O');
}
}
}
string s = "";//空串
while (!st.empty())
{
s += st.top();
st.pop();
}
reverse(s.begin(),s.end());//从栈底输出栈中元素
cout << s << endl;//切记换行
}
return 0;
}
M younik要排号
map的应用
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
int n;
cin >> n;
map<string,int> mp;
string s;
int cnt = 0;
for (int i = 0;i < n;i++)
{
cin >> s;
if (s != "younik" && mp[s] != 1)
{
mp[s] = 1;
cnt++;
}
else if (s != "younik" && mp[s] == 1) continue;
else if (s == "younik") break;
}
cout << cnt + 1;
return 0;
}