Shuffle'm Up
思路:首先我们需要知道两个停止条件第一就是找到了,那么怎么算没有找到呢?当一个字符串重复出现的时候就代表着已经不可能出现答案了。
犯下的错误:第一就是对string的使用不够了解。第二就是对map数组的使用也不是很熟悉,也常常犯下和string差不多。
收获到的知识:1.了解了substr函数的使用和clear函数的使用,对string是地址存放每一个单位的字符有了更深的了解,如string str; 然后str = str1 ;这个的意思就是将str1的全部赋值给str。
而str += str1的意思就是从str没有字符的地方开始一次将str1的开头位置赋给str。str.size()就是表示长度的意思。
完整代码如下:
#include<iostream>
#include<string>
#include<map>
using namespace std;
int t, len, step;
map<string, bool>vis;
int main()
{
cin >> t;
int cen = 0;
while (t--)
{
string s1, s2, s12;
cin >> len;
cin >> s1 >> s2 >> s12;
step = 0;
vis.clear();
while (1)
{
step++;
string str;
int i = 0;
for (int j = 0; j < len; j++)
{
str += s2[i++];
str += s1[j];
}
if (str == s12)
{
break;
}
if (vis[str] && str != s12)
{
step = -1;
break;
}
vis[str] = true;
s1 = str.substr(0, str.size() / 2);
s2 = str.substr(str.size() / 2, str.size());
}
cout << ++cen<<" "<<step << endl;
}
}
油藏
这个其实之前在洛谷上刷的一到题:
思路很简单就是使用一个嵌套循环将地图的全部都检查一遍,每一个坐标都要使用一次dfs将于油田相连的油田全部变成陆地,这样就可以防止当遍历重复的地方的时候就会重复计算。
代码如下:
#include<iostream>
#include<string>
#include<map>
char maze[120][120];
using namespace std;
int ans = 0;
int dx[] = {-1,-1,-1, 0, 0, 1, 1, 1};
int dy[] = {-1, 0, 1,-1, 1,-1, 0, 1};
int n, m;
void dfs(int x, int y)
{
for (int i = 0; i < 8; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if (tx<1 || tx>n || ty<1 || ty>m || maze[tx][ty] == '*')
continue;
if (maze[tx][ty] == '@')
maze[tx][ty] = '*';
dfs(tx, ty);
}
}
int main()
{
while (1)
{
ans = 0;
cin >> n >> m;
if (n == 0 && m == 0)
return 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> maze[i][j];
}
getchar();
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (maze[i][j] == '@')
{
ans++;
dfs(i, j);
}
}
}
cout << ans << endl;
}
return 0;
}