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;
} 
京公网安备 11010502036488号