第1次总结

先写题解吧

这次题解包括但不全包括做过的题目(水题、简单题不计题解)。题解包括CodeForeces、PTA天梯题组、以及其他竞赛题目。

 

若有错误还请指出


本来是道简单题的,但是我好像做复杂了。

比较值得注意的是后面没有多余空格,直接换行。

#include <bits/stdc++.h>

using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	int level = 1;
	int cost = 2 * pow(level, 2) - 1;
	char c;
	int n;
	cin >> n >> c;
//	if(n < 7)
//	{
//		cout << n;
//		return 0;
//	}
	while(n - cost >= 0)
	{
		level ++;
		cost = 2 * pow(level, 2) - 1;
//		cout << "Now need " << cost << endl;
	}
	level --;
//	cout << "level = " << level << endl;
	cost = 2 * pow(level, 2) - 1;
	int rest = n - cost;
	int Limit = -1, lim = level;
	for(int i = 1;i <= 2 * level - 1;i ++)
	{
		if(i == level + 1) Limit = -Limit;
		lim += Limit;
//		cout << lim << endl;
		for(int j = 1;j <= 2 * level - 1;j ++)
		{
//			cout << abs(j - level) << ":" << lim << endl;
			if(abs(j - level) <= lim && j < level + lim + 1)
			{
				cout << c;
			}
			else if(j <= level) 
			{
				cout << ' ';
			}
			else break;
		}
		cout << endl;
	}
	cout << rest << endl;
	return 0;
}

/*
	ooo		ooooo		ooooooo
	 o		 ooo		 ooooo
	ooo		  o			  ooo
			 ooo		   o
			ooooo		  ooo
						 ooooo
						ooooooo


*/

先用while取得能获得的沙漏的最大层数,然后沙漏的层数和大小的关系就是2 * n^2 - 1

初始化范围为最大,即abs(j - level) <= lim && j < level + lim + 1

j <= level 用于判断是否位于前半段,否则在后半段不满足时直接换行,符合输出条件

初始化范围递减,越往下打印越细

最后根据大小和层级,在到达最小的位置时更变范围为递增,继续打印直到到达大小


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main ()
{
	ios::sync_with_stdio(false);
	ll n;
	cin >> n;
	ll st = 2, len = 0;
	ll tmpst = 2, tmplen = 0;
//	cout << (ll)sqrt(n) << endl;
	ll lim = (ll)sqrt(n);
	ll tmpd = n;
	for(ll i = 2;i <= lim + 1;i ++)
	{
		if(n % i == 0)
		{
			ll divn = i;
			tmplen = 0;
			tmpd = n;
//			cout << "Can div " << i << " and now tmplen = " << tmplen << endl;
			while(tmpd != 1 && tmpd % divn == 0)
			{	
				tmpd /= divn;
				tmplen ++;	
				divn ++;
			}
//			cout << "Can div " << i << " and now tmplen = " << tmplen << endl;
		}
		if(tmplen > len)
		{
			len = tmplen;
			st = tmpst;
		}
		tmpst = i + 1;
		tmplen = 0;
	}
	if(tmplen > len)
	{
		len = tmplen;
		st = tmpst;
	}
	if(len == 0)
	{
		len = 1;
		st = n;
	}
	cout << len << endl;
	for(ll i = st;i < st + len - 1;i ++)
	{
		cout << i << "*";
	}
	cout << len + st - 1 << endl;
	return 0;
}

主要就是从2到n的平方根的遍历和连续判断

若i = 3时n能被3整除(余数为0),则进入循环判断i = 4时、i = 5 时... ...直到不能整除为止

在跳出连续判断后,取长度的最大值并记录最大值时开头的数字

在遍历全部结束后,最后从最大值开头数字开始循环输出最大值开头数字 + i,即连续数字


#include <bits/stdc++.h>

using namespace std;

int main()
{
	string a, b;
	getline(cin, a, '\n');
	getline(cin, b, '\n');
	int lena = a.size();
	int lenb = b.size();
	for(int i = 0;i < lenb;i ++)
	{
		char c = b[i];
		for(int j = 0;j < a.size();j ++)
		{
			if(a[j] == c)
			{
				a.erase(j, 1);
				j --;
			}
		}
	}
	cout << a;
	return 0;
}

 先输入两段字符串a、b,使用getline(因为我用的string)

再遍历从b[0]到b[n]的字符(n为b的长度),使用find函数

如果a.find(b[i]) < a.size(),即找到了b[i]在a中的位置,那么就把a[a.find(b[i])]删掉,即删掉找到的那个位置的字符,这里使用erase函数

最后把处理完的字符串a输出。


#include <bits/stdc++.h>

using namespace std;

int main()
{
	int T;
	cin >> T;
	int vis[100000] = {0};
	for(int t = 0;t < T;t ++)
	{
		int n;
		cin >> n;
		for(int i = 0;i < n;i ++)
		{
			int num;
			cin >> num;
			if(n > 1)
			{
				vis[num] = 1;
			}
		}
	}
	int n;
	cin >> n;
	int alone = 0;
	int first = 1;
	for(int i = 0;i < n;i ++)
	{
		int num;
		cin >> num;
		if(!vis[num])
		{
			if(!first) cout << " ";
			else
			{
				first = 0;
			}
			if(num < 10000) cout << "0";
			if(num < 1000) cout << "0";
			if(num < 100) cout << "0";
			if(num < 10) cout << "0";
			cout << num;
			vis[num] = 1;
			alone = 1;
		}
	}
	if(!alone)
	{
		cout << "No one is handsome";
	}
	cout << '\n';
	return 0;
}

范围还可以,用数组去存“这个人有没有朋友"

如果在输入朋友圈的阶段,朋友圈人数>=2,那么就把接下来的输入加到数组里

最后得到了完整的vis数组记录,接下来查询阶段只要vis[i] = 0的,特殊化输出即可

用alone去标记“是否有人没有朋友”,最后特判输出


#include <bits/stdc++.h>

using namespace std;

queue<char> qG;
queue<char> qP;
queue<char> qL;
queue<char> qT;

int main()
{
	string str;
	cin >> str;
	int len = str.size();
	for(int i = 0;i < len;i ++)
	{
		char c = str[i];
		if(c >= 'a') c -= 32;
		switch (c) 
		{
			case 'G':
				qG.push('G');
				break;
			case 'P':
				qP.push('P');
				break;
			case 'L':
				qL.push('L');
				break;
			case 'T':
				qT.push('T');
				break;
		}
	}
	while(!qG.empty() || !qP.empty() || !qL.empty() || !qT.empty())
	{
		if(!qG.empty())
		{
			cout << qG.front();
			qG.pop();
		}
		if(!qP.empty())
		{
			cout << qP.front();
			qP.pop();
		}
		if(!qL.empty())
		{
			cout << qL.front();
			qL.pop();
		}
		if(!qT.empty())
		{
			cout << qT.front();
			qT.pop();
		}
	}
	return 0;
}

其实这道题根本不用队列存的... ...根本不用... ...用数组就行了,我写完了才醒悟。

不过写都写完了,那就给他过了吧。

为什么这道题值20分?


#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	char c;
	cin >> n >> c;
	getchar();
	string str;
	getline(cin, str, '\n');
	int len = str.size();
	if(len > n)
	{
//		cout << "DO" << endl;
		int pos = len - n;
		str.erase(0, pos);
	}
	else if(len < n)
	{
		for(int i = 0;i < n - len;i ++)
		{
			str = c + str;
		}
	}
	cout << str;
	return 0;
}

总的来说就是长度判断,然后决定是加是减。

加的话循环str = c + str就行了

减得话str.erase(0, pos)就行了(用substr也行)

比较水


#include <bits/stdc++.h>

using namespace std;

struct stu {
	string name;
	double guess;
};

int main()
{
	int n;
	cin >> n;
	struct stu stus[n];
	double sum = 0;
	for(int i = 0;i < n;i ++)
	{
		cin >> stus[i].name >> stus[i].guess;
		sum += stus[i].guess;
	}
	double aver = sum / n;
	aver /= 2.0;
	int index = 0;
	for(int i = 0;i < n;i ++)
	{
		if(abs(stus[i].guess - aver) < abs(stus[index].guess - aver))
		{
			index = i;
		}
	}
	cout << fixed << setprecision(0) << aver << " " << stus[index].name;
	return 0;
}

结构体+遍历输入+遍历找最接近的值和位置

然后最后再输出

思路清晰


然后是CF的题目


#include <bits/stdc++.h>

using namespace std;

int main()
{
	int T;
	cin >> T;
	getchar();
	for(int t = 0;t < T;t ++)
	{
		string a;
		char c;
		cin >> a >> c;
		if(a.size() <= 1 && a[0] != c)
		{
			cout << "NO" << endl;
			continue;
		}
		int pos = 0;
		int OK = 0;
		while(pos < a.size())
		{
//			cout << pos << endl;
			if(a[pos] != c)
			{
				pos ++;
				continue;
			}
			if((pos + 1) % 2 == 1)
			{
				OK = 1;
				break;
			}
			else
			{
				pos ++;
				continue;
			}
		}
		if(OK)
		{
			cout << "YES" << endl;
		}
		else
		{
			cout << "NO" << endl;
		}
	}
	return 0;
}

 这道题看是不是奇数位即可,如果要的字符在奇数位,那么就输出"Yes",否则输出"No"

对于相同的字符,遍历判断即可


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()
{
	int T;
	cin >> T;
	for(int t = 0;t < T;t ++)
	{
		ll l, r, a;
		cin >> l >> r >> a;
		if(a == 1)
		{
			cout << 2 * r << endl;
		}
		else
		{
			if(r > a)
			{
				while(r - a > a && r - a >= l)
				{
					r -= a;
				}
				if(r % a == 0) r --;
				ll x1 = r / a + r % a;
				if(l < a)
				{
					ll x2 = (a - 1) / a + (a - 1) % a;
					ll x = max(x1, x2);
					cout << x << endl;
				}
				else
				{
					cout << x1 << endl;
				}
			}
			else
			{
				if(r == a && l < a) r --;
				ll x = r / a + r % a;
				cout << x << endl;
			}
		}
		
	}
	return 0;
}

 比较关键的公式是取余的最大值就是 a = a - a % b - 1

再加几个范围判断就可以过了

如果a = 1比较特殊,得额外判断。


 

#include <bits/stdc++.h>

using namespace std;

struct node {
	int index;
	int pos;
	int wei;
};

bool cmp1(node a, node b)
{
	return a.wei < b.wei;
}

bool cmp2(node a, node b)
{
	return a.pos < b.pos;
}

int main()
{
	int T;
	cin >> T;
	for(int t = 0;t < T;t ++)
	{
		getchar();
		getchar();
		int n, m;
		cin >> n >> m;
		struct node nodes[m];
		for(int i = 0;i < m;i ++)
		{
			cin >> nodes[i].pos >> nodes[i].wei;
			nodes[i].index = i + 1;
		}	
		sort(nodes, nodes + m, cmp1);
		sort(nodes, nodes + 2 * n, cmp2);
		int sum = 0;
		for(int i = 0;i < 2 * n;i ++)
		{
			sum += nodes[i].wei;
		}
		cout << sum << endl;
		int posl = 0, posr = 2 * n - 1;
		for(int i = 0;i < n;i ++)
		{
			cout << nodes[posl].index << " " << nodes[posr].index << endl;
			posl ++;
			posr --;
		}
		cout << endl;
	}
	
	return 0;
}

取最小的几段,只要加2个sort就行。

第一个sort把它们的权值从小到大排。

第二个sort根据用户输入的n,排前 2*n个,按照下标来排。

最后分别从前2*n的两端往中间取、输出即可。


 

#include <bits/stdc++.h>

using namespace std;


int main()
{
	int T;
	cin >> T;
	for(int i = 0;i < T;i ++)
	{
		int n;
		cin >> n;
		if(n == 1)
		{
			cout << 1 << endl;
		}
		else
		{
			long long ans = pow(2, n) - 1;
			cout << ans << endl;
		}
	}
	return 0;
}

可以直接找规律,得到最终胜利的是2^n - 1


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()
{
	int T;
	cin >> T;
	for(int i = 0;i < T;i ++)
	{
		int n;
		cin >> n;
		vector<ll> vec(0);
		int can = 1;
		for(int i = 1;i <= n;i ++)
		{
			ll tmp = pow(3, i - 1);
			if(tmp > 1000000000)
			{
				cout << "NO" << endl;
				vec.clear();
				can = 0;
				break;
			}
			else
			{
				vec.push_back(tmp);
			}
		}
		if(can)
		{
			cout << "YES" << endl;
			for(int i = 0;i < n;i ++)
			{
				cout << vec[i] << " ";
			}	
			cout << endl;
		} 
	}
	return 0;
}

其实这道题就是个等比数列,首项为1,公比为3。这是符合题目要求的最小数组。

如果到最后的值大于1e9,那么就输出No,反之则输出Yes并输出整个数组即可。


还有一些最近天梯打的比赛题目(就不写水题题解了)


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll const INF = 1e9 + 7;

ll n, m, T;

int main()
{
	string str;
	cin >> str;
	int pos = 0;
	string tmp;
	ll sum = 0;
	while(pos < str.size())
	{
		
		if(str[pos] >= '0' && str[pos] <= '9')
		{
			tmp = tmp + str[pos];
		}
		else
		{
			ll temp = atoll(tmp.c_str());
			sum += temp;
			tmp = "";
		}
		pos ++;
	}
	cout << sum << endl;
	return 0;
}

字符串操作提取,提取到临时字符串里,然后用atoll函数转成long long类型,加起来就可以。


#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll const INF = 1e9 + 7;

ll n, m, T;

map<string, int> WTN;
map<int, string> NTW;

void init()
{
	WTN["zero"] = 0;
	WTN["one"] = 1;
	WTN["two"] = 2;
	WTN["three"] = 3;
	WTN["four"] = 4;
	WTN["five"] = 5;
	WTN["six"] = 6;
	WTN["seven"] = 7;
	WTN["eight"] = 8;
	WTN["nine"] = 9;
	WTN["ten"] = 10;
	
	NTW[0] = "zero";
	NTW[1] = "one";
	NTW[2] = "two";
	NTW[3] = "three";
	NTW[4] = "four";
	NTW[5] = "five";
	NTW[6] = "six";
	NTW[7] = "seven";
	NTW[8] = "eight";
	NTW[9] = "nine";
	NTW[10] = "ten";
	NTW[11] = "eleven";
	NTW[12] = "twelve";
	NTW[13] = "thirteen";
	NTW[14] = "fourteen";
	NTW[15] = "fifteen";
	NTW[16] = "sixteen";
	NTW[17] = "seventeen";
	NTW[18] = "eighteen";
	NTW[19] = "nineteen";
	NTW[20] = "twenty";
}

int main()
{
	init();
	cin >> T;
	for(int t = 0;t < T;t ++)
	{
		string a, b;
		cin >> a >> b;
		int a1 = WTN[a];
		int b1 = WTN[b];
		int c = a1 + b1;
		cout << NTW[c] << endl;
	}
	return 0;
}

 map + 加法... ...


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll const INF = 1e9 + 7;

int n, m, T;

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int rdic[4] = {3, 2, 0, 1};

int main()
{
	int k;
	cin >> k;
	n = (int)sqrt(k);
	m = k / n;
	swap(n, m);
//	cout << n << " " << m << endl;
	int a[n + 1][m + 1] = {0};
	int vis[n + 1][m + 1] = {0};
	for(int i = 0;i < n;i ++)
	{
		for(int j = 0;j < m;j ++)
		{
			vis[i][j] = 0;
		}
	}
	int posx = 0, posy = 0;
	vis[posx][posy] = 1;
	int dic = 3;
	int b[k];
	for(int i = 0;i < k;i ++)
	{
		cin >> b[i];
	}
	sort(b, b + k);
	int pos = k - 1;
	for(int i = 0;i < k;i ++)
	{
//		cout << posx << " " << posy << endl;
		a[posx][posy] = b[pos --];
//		cout << vis[2][2] << endl;
		if(posx + dx[dic] >= n || posx + dx[dic] < 0 || posy + dy[dic] >= m || posy + dy[dic] < 0 || vis[posx + dx[dic]][posy + dy[dic]])
		{
//			if(posx + dx[dic] >= n) cout << "r1" << endl;
//			else if(posx + dx[dic] < 0) cout << "r2" << endl;
//			else if(posy + dy[dic] >= m) cout << "r3" << endl;
//			else if(posy + dy[dic] < 0) cout << "r4" << endl;
//			cout << "Change Dic to " << rdic[dic] << endl;
			dic = rdic[dic];
		}
		vis[posx][posy] = 1;
		posx += dx[dic];
		posy += dy[dic];
	}
	for(int i = 0;i < n;i ++)
	{
		for(int j = 0;j < m - 1;j ++)
		{
			cout << a[i][j] << " ";
		}
		cout << a[i][m - 1];
		cout << endl;
	}
	return 0;
}

我先用了排序排了输入数组,然后用类似遍历地图的方式一个个填了进去。


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll const INF = 1e9 + 7;

ll n, m, T;
int cnt = 0;

struct node {
	node *Parent;
	node *L;
	node *R;
	int vl, vr;
	char c;
};

void OuF(node *point)
{
//	cout << "Do" << endl;
	if(point->L == NULL && point->R == NULL)
	{
//		cout << point->c << " is a leave" << endl;
		cnt ++;	
	} 
	cout << point->c;
	if(point->L != NULL)
	{
		OuF(point->L);
	}
	if(point->R != NULL)
	{
		OuF(point->R);
	}
}

void OuM(node *point)
{
	if(point->L != NULL)
	{
		OuM(point->L);
	}
	cout << point->c;
	if(point->R != NULL)
	{
		OuM(point->R);
	}
}

void OuA(node *point)
{
	if(point->L != NULL)
	{
		OuA(point->L);
	}
	if(point->R != NULL)
	{
		OuA(point->R);
	}
	cout << point->c;
}

int main()
{
	string s;
	cin >> s;
	if(s == "#")
	{
		cout << 0;
		return 0;
	}
	int len = s.size();
	int level = 1;
//	cout << len << endl;
	while(pow(2, level) - 1 < len)
	{
		level ++;
	}
//	cout << level;
	char a = s[0];
	node *TreeNode = new node;
	TreeNode->Parent = NULL;
	TreeNode->L = NULL;
	TreeNode->R = NULL;
	TreeNode->c = a;
	TreeNode->vl = 0;
	TreeNode->vr = 0;
//	cout << a;
	node *point = TreeNode;
	for(int i = 1;i < len;i ++)
	{
		a = s[i];
		if(point->L == NULL && a != '#' && point->vl == 0)
		{
//			cout << "GoL";
			node *NewNode = new node;
			node *thisnode = point;
//			cout << "OK\n";
			point->L = NewNode;
			point->L->Parent = thisnode;
//			cout << "OK\n";
			NewNode->L = NULL;
			NewNode->R = NULL;
			NewNode->vl = 0;
			NewNode->vr = 0;
			NewNode->c = a;
			point->vl = 1;
			point = point->L;	
		}
		else if(point->R == NULL && a != '#' && point->vr == 0)
		{
//			cout << "GoR";
			node *NewNode = new node;
			point->R = NewNode;
			point->R->Parent = point;
//			cout << "OK\n";
			NewNode->L = NULL;
			NewNode->R = NULL;
			NewNode->vl = 0;
			NewNode->vr = 0;
			NewNode->c = a;
			point->vr = 1;
			point = point->R;	
		}
		else if(point->L == NULL && a == '#' && point->vl == 0)
		{
			point->vl = 1;
		}
		else if(point->R == NULL && a == '#' && point->vr == 0)
		{
			point->vr = 1;
		}
		while(point->vl == 1 && point->vr == 1)
		{
//			cout << "Ex";
			if(point == TreeNode) break;
			point = point->Parent;
		}
//		cout << "Put " << a << " Successfully" << endl;
	}
//	cout << "OK" << endl;
	point = TreeNode;
	OuF(point);
	cout << endl;
	OuM(point);
	cout << endl;
	OuA(point);
	cout << endl << cnt;
	return 0;
}

采用了比较复杂的方式判断+建树... ..

主要复杂的地方在建树和输入判断。

先序、中序、后序遍历比较好写。


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef unsigned short us;

int main()
{
	ios::sync_with_stdio(false);
	int m, n;
	cin >> n >> m;
	us mp[n + 1][m + 1];
	us vis[n + 1][m + 1];
	int k;
	cin >> k;
	for(int i = 0;i < n + 1;i ++)
		for(int j = 0;j < m + 1;j ++) 
		{
			mp[i][j] = 0;
			vis[i][j] = 0;
		}
			
	for(int i = 0;i < k;i ++)
	{
		int x, y;
		cin >> x >> y;
		mp[x - 1][y - 1] = 1;
	}
	int maxlen = 0;
	for(int i = 0;i < n;i ++)
	{
		for(int j = 0;j < m;j ++)
		{
			if(mp[i][j] && !vis[i][j])
			{
				vis[i][j] = 1;
//				cout << "Now main pos is " << i + 1 << ", " << j + 1 << endl;
				for(int ii = 0;ii < n;ii ++)
				{
					for(int jj = 0;jj < m;jj ++)
					{
						if((i == ii && j == jj ) || !mp[ii][jj]) continue;
//						cout << "locate " << ii + 1 << ", " << jj + 1 << endl;
						us uflag = 1, dflag = 1;
						int dx = abs(i - ii);
						int dy = abs(j - jj);
						int cnt = 0;
						int ustx = i, usty = j, dstx = i, dsty = j;
						while(1)
						{
							if(ustx >= n || usty >= m)
							{
//								cnt ++;
								break;
							}
							else if(!mp[ustx][usty])
							{
								uflag = 0;
								break;
							}
//							cout << "To " << ustx + 1 << ", " << usty + 1<< endl;
							cnt ++;
							ustx += dx;
							usty += dy;
						}
						if(!uflag) continue;
						while(1)
						{
							if(dstx < 0 || dsty < 0)
							{
//								cnt ++;
								break;
							}
							else if(!mp[dstx][dsty])
							{
								dflag = 0;
								break;
							}
//							cout << "To " << dstx + 1 << ", " << dsty + 1 << endl;
							cnt ++;
							dstx -= dx;
							dsty -= dy;
						}
						if(!dflag) continue;
//						cout << "Go from " << i + 1 << ", " << j + 1 << " to " << ii + 1 << ", " << jj + 1 << " success" << endl;
//						cout << "cnt = " << cnt - 1 << endl;
						maxlen = max(maxlen, cnt - 1);
					}
				}
			}
		}
	}
	cout << maxlen;
	return 0;
}

原来这道题真可以遍历暴力解,只能说这题数据很水。

思路就是:暴力遍历整个地图得到第一个子,然后再遍历整个地图得到第二个子,然后再根据两个子之间的初始位置进行一条直线的两边走,两边都走得出去就更新最多的子数,否则不更新,遍历下一个。

最后输出的就是最多的子数。


 

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll const INF = 1e9 + 7;

ll n, m, T;

double RubbishCalculateWay()
{
	string a;
	cin >> a;
	switch (a[0]) 
	{
		case '+':
			return RubbishCalculateWay() + RubbishCalculateWay();
			break;
		case '-':
			return RubbishCalculateWay() - RubbishCalculateWay();
			break;
		case '*':
			return RubbishCalculateWay() * RubbishCalculateWay();
			break;
		case '/':
			return RubbishCalculateWay() / RubbishCalculateWay();
			break;
		default:
			return atof(a.c_str());
			break;
	}
}

int main()
{
	cout << fixed << setprecision(6) << RubbishCalculateWay();
	return 0;
}

这道题原本根本没想到递归,被别人一点就通了


#include <bits/stdc++.h>

using namespace std;

typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned short us;
typedef double db;

const ll INF = 1e9 + 7;

int dx[4] = {-1, 1, 0, 0};
int dy[4] = {0, 0, -1, 1};

ui T, M, N;

int main()
{
	ios::sync_with_stdio(false);
	cin >> T;
	
	for(ui t = 0;t < T;t ++)
	{
		cin >> N >> M;
		us mp[N][M];
		for(ui i = 0;i < N;i ++)
			for(ui j = 0;j < M;j ++)
			{
				mp[i][j] = 0;
			}
		queue<pair<int, int>> que;
		queue<int> stepsque;
		int n;
		cin >> n;
		for(int i = 0;i < n;i ++)
		{
			int a, b;
			cin >> a >> b;
			mp[a][b] = 1;
		}
		int stx, sty, edx, edy;
		cin >> stx >> sty >> edx >> edy;
		pair<int, int> stpos(stx, sty);
		que.push(stpos);
		stepsque.push(0);
		int havefound = 0;
		while(!que.empty())
		{
			int x = que.front().first;
			int y = que.front().second;
			int step = stepsque.front();
			mp[x][y] = 2;
			if(x == edx && y == edy)
			{
				cout << step << endl;
				havefound = 1;
				break;
			}
			for(int i = 0;i < 4;i ++)
			{
				int nx = x + dx[i];
				int ny = y + dy[i];
				if(nx >= 0 && nx < N && ny >= 0 && ny < M && mp[nx][ny] != 1 && mp[nx][ny] != 2)
				{
					pair<int, int> nextpos(nx, ny);
					que.push(nextpos);
					stepsque.push(step + 1);
				}
			}	
			que.pop();
			stepsque.pop();
		}
		if(!havefound) cout << "Not arrive" << endl;
	}
	return 0;
}

 感觉是很经典的地图搜索题目,这里使用bfs,用两个队列分别记录下一个位置和到下一个位置时的步数。


 

#include <bits/stdc++.h>

using namespace std;

typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned short us;
typedef double db;

const ll INF = 1e9 + 7;

ui T, M, N;

int main()
{
	ios::sync_with_stdio(false);
	cin >> N;
	for(ui i = 0;i < N;i ++)
	{
		string a, b;
		cin >> a >> b;
		a = a + a;
		if(a.find(b) < a.size())
		{
			cout << "Yes" << endl;
		} else {
			cout << "No" << endl;
		}
	}
	return 0;
}

是个环嘛,那我把它的头尾接起来(a = a + a),再用一下find函数,如果找到了就输出Yes,否则输出No。


感觉这周干的事挺多的写出来又感觉没那么多,是真的挺忙的。

最近也要开始学JAVA了,为后来做项目准备。

环境还没有配置好,不过JDK应该是装好了。

接下来这周感觉在比赛打完之后可以把重心放一点在JAVA上了(项目感觉挺复杂的)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ISansXI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值