A. 「壶中的大银河」
分析 :A和B都告诉我%c似乎不能连续读,如for(1~100) scanf("%c",&s[ i ]) ; 虽然我不知道为啥 ,这种就直接读字符串吧
code :
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,ans=0;
	char s[100004];
	scanf("%d%s",&n,s+1);
	for(int i=1;i<=n;i++) if(s[i]=='G') ans++;
	printf("%d",ans);
	return 0;
}
B. 「龙颈之玉 -五色的弹丸 -」
分析 : 参考题解,虽然是个模拟,但是思维还是挺巧妙的,在适当的时候使用queue,stack等stl让模拟更容易
code :
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 405;
char s[maxn][maxn],op[100003];
queue<pair<int,int> > q;
void go(int &x,int &y,char c)
{
	if(c=='W') x--;
	else if(c=='A') y--;
	else if(c=='S') x++; 
	else y++;
}
int main()
{
	int n,m,x,y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {
		scanf("%s",s[i]+1);
		for(int j=1;j<=m;j++) if(s[i][j]=='@') {
			q.push(make_pair(i,j));
			x=i,y=j;
		}
	}
	s[x][y]='.';
	scanf("%s",op+1);
	int len=strlen(op+1);
	for(int i=1;i<=len;i++) {
		go(x,y,op[i]);
		q.push(make_pair(x,y)); 
		if(x<1||y<1||x>n||y>m) {
			printf("GG"); return 0;
		}
		else if(s[x][y]=='o') s[x][y]='.';
		else q.pop();
	}
	pair<int,int> now;
	while(q.size()>1)
	{
		now=q.front();
		s[now.first][now.second]='X';
		q.pop();
	}
	now=q.front();
	s[now.first][now.second]='@';
	for(int i=1;i<=n;i++) printf("%s\n",s[i]+1);
	return 0;
}
C. 「佛御石之钵 -不碎的意志 -」(简单版)
分析 :其实做麻烦了,直接深搜计数即可
code :
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 303;
char s[maxn][maxn];
int m,n,ans,dx[4]={-1,0,1},dy[4]={-1,0,1},vis[maxn][maxn],fa[maxn*maxn],num[maxn*maxn];
bool check(int x,int y)
{
	if(x<1||y<1||x>n||y>m) return false;
	return true;
}
void Init()
{
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) vis[i][j]=0,fa[(i-1)*m+j]=(i-1)*m+j,num[(i-1)*m+j]=0;
}
int Find(int x)
{
	return fa[x]=(fa[x]==x?x:Find(fa[x]));
}
void dfs(int x,int y)
{
	int p,q;
	if(s[x][y]=='0') return;
	vis[x][y]=1;
	for(int i=0;i<3;i++) for(int j=0;j<3;j++) if(abs(dx[i])!=abs(dy[j])) 
	{
		p=x+dx[i],q=y+dy[j];
		if(check(p,q)&&s[p][q]=='1'&&!vis[p][q]) {
			fa[(p-1)*m+q]=Find((x-1)*m+y);
			dfs(p,q);
		}
	}
}
int main()
{
	int q;
	char str[maxn];
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) {
		scanf("%s",str);
		for(int j=1;j<=m;j++) s[i][j]=str[j-1];
	}
	scanf("%d",&q);
	while(q--)
	{
		int a,b,x,y,ans=0;
		scanf("%d%d%d%d",&a,&b,&x,&y);
		Init();
		for(int i=a;i<=x;i++) for(int j=b;j<=y;j++) s[i][j]='1';
		for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) 
			if(!vis[i][j]&&s[i][j]=='1') dfs(i,j);
		for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(s[i][j]=='1'&&num[fa[(i-1)*m+j]]==0) 
		{
			ans++; num[fa[(i-1)*m+j]]=1;
		}
		printf("%d\n",ans); 
	}
	return 0;
}