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;
}