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