Codeforces Round #290 (Div. 2) B题 C题
来源:互联网 发布:电信网络接入点那个快 编辑:程序博客网 时间:2024/04/28 00:49
详细:view
B题:
题意:给定N*M的矩阵,判断是否有环,要求环上的每一个格子颜色相同,且至少有4个格子。
思路:转化为无向图中是否有环的问题。如果对于一个连通图,没有环的话,那么则形成一棵树,设树上顶点数为V,
总的边数为sum(每个点的度数之和的一半),则v-sum=1,可由此判断连通图是否有环。对于非连通图,dfs就可以解决了。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<cmath>#include<map>#include<set>#define SD second#define FT first#define sf scanf#define pf printfusing namespace std;typedef long long LL;typedef pair<int ,int> P;bool vis[55][55];char g[55][55];int n,dx[4]={-1,1,0,0};int m,dy[4]={0,0,-1,1};int sum,v;int cal(P st,char ch){ int ans=0; for(int k=0;k<4;k++){ int i,j; i=st.FT+dx[k],j=st.SD+dy[k]; if(i>=0&&i<n&&j>=0&&j<m&&g[i][j]==ch) ans++; } return ans;}void dfs(int i,int j,char ch){ vis[i][j]=1; v++,sum+=cal(make_pair(i,j),ch); for(int k=0;k<4;k++){ int x,y; x=i+dx[k],y=j+dy[k]; if(x>=0&&x<n&&y>=0&&y<m&&g[x][y]==ch&&!vis[x][y]) dfs(x,y,ch); }}int main(){ sf("%d%d",&n,&m); for(int i=0;i<n;i++) sf("%s",g[i]); bool ok=0; for(int k=0;k<26;k++) { char ch='A'+k; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++) if(g[i][j]==ch&&!vis[i][j]){ sum=0,v=0; dfs(i,j,ch); if((v-(sum/2))==1||v==0) continue; else { ok=1; break; } } if(ok) break; } } if(ok) puts("Yes"); else puts("No"); return 0;}
C题:
题意:给定一组字符串序列,求一组a-z合法的排列使得给定的序列是以由小到大的字母序排列的。
思路:简单的top排序题,关键就是建图,把一个字母当做一个节点,题目还是很简单的,感觉B,C题没多大难度差别!
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<cmath>#include<map>#include<queue>#define SD second#define FT first#define sf scanf#define pf printfusing namespace std;typedef long long LL;typedef pair<int ,int> P;char ss[105][105];int indu[30];vector<int> ans,G[30];int get(char s1[],char s2[]){ int pos=-1,len=min(strlen(s1),strlen(s2)); for(int i=0;i<len;i++) if(s1[i]!=s2[i]) { pos=i; break; } return pos;}void topsort(){ int u;queue<int> q; for(int i=0;i<26;i++) if(indu[i]==0) ans.push_back(i),q.push(i); while(!q.empty()){ int v=q.front();q.pop(); for(int i=0;i<G[v].size();i++) { u=G[v][i];indu[u]--; if(indu[u]==0){ ans.push_back(u); q.push(u); } } } if(ans.size()!=26) puts("Impossible"); else{ for(int i=0;i<26;i++) pf("%c",ans[i]+'a'); }}int main(){ memset(indu,0,sizeof(indu)); for(int i=0;i<30;i++) G[i].clear(); ans.clear(); int n;sf("%d",&n); for(int i=0;i<n;i++){ sf("%s",ss[i]); } bool ok=1; for(int i=0;i<n-1;i++){ int pos=get(ss[i],ss[i+1]); if(pos==-1){ if(strlen(ss[i])>strlen(ss[i+1])) { ok=0; break; } else continue; } else{ indu[ss[i+1][pos]-'a']++; G[ss[i][pos]-'a'].push_back(ss[i+1][pos]-'a'); } } if(!ok) puts("Impossible"); else { topsort(); } return 0;}
0 0
- Codeforces Round #290 (Div. 2) B题 C题
- Codeforces Round #296 (Div. 2) B C题
- Codeforces Round #169 (Div. 2) B题
- Codeforces Round #188 (Div. 2) B题
- Codeforces Round #218 (Div. 2) B题
- Codeforces Round #238 (Div. 2) B题
- Codeforces Round #402 (Div. 2) B题
- Codeforces Round #404 (Div. 2) B题
- Codeforces Round #446 (Div. 2) B 题
- Codeforces Round #243 (Div. 2) B C
- Codeforces Round #266 (Div. 2) B & C
- Codeforces Round #258 (Div. 2) B C
- Codeforces Round #307 (Div. 2) B C
- Codeforces Round #407 (Div. 2) B+C!
- Codeforces Round #431 (Div. 2) B, C
- Codeforces Round #448 (Div. 2) B,C,
- Codeforces Round #447 (Div. 2) B,C
- Codeforces Round #449 (Div. 2) (B、C)
- linux命令详解之useradd命令使用方法
- 20150203 N1
- ios Images.xcassets 创建
- 高精度加法减法乘法除法
- UITextView
- Codeforces Round #290 (Div. 2) B题 C题
- ~`~学习网址连接
- 设计模式-策略模式
- 各种排序方法
- 【转】Android中<meta-data>的使用
- android之apk如何防止被反编译
- 通过viewSwitch实现加载进度条到内容显示的转场处理
- Zoj 3707 calculate prime s
- Android MP3录音实现