练习

 

第一题 区域计算

【模拟】

某地区爆发病毒,给定一个矩阵,x代表隔离墙,o代表病毒,病毒区域是由它水平方向或垂直方向上相邻的病毒连接而成,斜角连接不会构成病毒区域。你要计算出矩阵中有几个病毒区域(假设矩阵周边是被隔离墙包围的)。

1.输入:

4 5
x o x x x
x x x o x
x x o o x
x x x x x

输出:2

2.输入:

4 4
o o x x
x x x o
o o o x
x o x o

输出:4

#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
struct node{
	int row;
	int col;
};
int direct[4][2]={{0,-1},{0,1},{1,0},{-1,0}};//方向数组 
int virusArea(int n,int m,vector<vector<char> > &arr){
	int isvisited[n][m];//标记数组 
	memset(isvisited,0,sizeof(isvisited));//初始化标记数组 ,搜索过就置于1 
	int count =0;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(arr[i][j]=='o'&&!isvisited[i][j]){
				queue<node> q;//一个位置搜索队列 
				node curNode; //当前位置 
				curNode.row=i;
				curNode.col=j;
				q.push(curNode);
				while(!q.empty()){ 
					curNode=q.front();
					isvisited[curNode.row][curNode.col]=1;
					q.pop();//如果已经遍历过,从搜索队列中移除 
					for(int k=0;k<4;k++){
						node nextNode;
						nextNode.row=curNode.row+direct[k][0];
			          	nextNode.col=curNode.col+direct[k][1];
						if(nextNode.row!=-1&&nextNode.row!=n&&nextNode.col!=-1&&nextNode.col!=m){
							if(arr[nextNode.row][nextNode.col]=='o'&&(!isvisited[nextNode.row][nextNode.col])){
								q.push(nextNode);
							}
						}
					}
				}
				count++;
			}
		}
	}
	return count;
}
int main(){
	int n,m;
	cin>>n>>m;
	vector<vector<char> > arr(n, vector<char>(m));//二维容器建立 
	for(int i=0;i<n;i++){  //输入操作 
		for(int j=0;j<m;j++){
			cin>>arr[i][j];
		}
	}
	int sum=virusArea(n,m,arr);
	cout<<sum;
} 

第二题 

【字符串简单匹配】

描述
给定两个字符串s和t,请判断s是否是t的子序列。即从t中删除一些字符,将剩余的字符连接起来,即可获得s。
输入
包括若干个测试数据。每个测试数据由两个ASCII码的数字和字母串s和t组成,s和t的长度不超过100000。
输出
对每个测试数据,如果s是t的子序列则输出“Yes”,否则输出“No”。
样例输入
sequence subsequence
person compression
VERDI vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
样例输出
Yes
No
Yes
No

#include <iostream>
#include <cstring>
using namespace std;
const int N=110000;
int main(){
	char s[N],t[N];
	while(scanf("%s %s",&s,&t) != EOF){
	int slen=strlen(s);
	int tlen=strlen(t);
	int flag;
	for(int i=0,j=0;i<slen,j<tlen;){
		if(s[i]==t[j]){
			i++;
			j++;
		}
		else j++;
		flag=i;
	}
	if(flag==slen){
		printf("YES\n");
	} 
	else printf("NO\n");
	}
	
	return 0;
}

第三题 

【简单凯撒密码】

ulius Caesar发明了一个将字符串转换为另一个

原始字符串:ABCDEFGHI JKLMNOPQRSTUVWXYZ 
加密字符串:VWXYZABCDEFGH IJKLMNOPQRSTU 

原始字符串中的所有字母均为大写。

字母以外的 字符保持不变。

输入

开始
NS BFW,JAJSYX TK NRUTWYFSHJ FWJ YJJ WJXZQY TK YWNANFQ HFZXJX
结束
开始
ñBTZQI WFYMJW GJ KNWXY NS˚FQNYYQJ NGJWNFS ANQQFLJ YMFS XJHTSI NS WTRJ
结束
开始
IFSLJW PSTBX KZQQ BJQQ YMFY HFJXFW NX RTWJ IFSLJWTZX YMFS MJ
结束
ENDOFINPUT

输出

IN WAR, EVENTS OF IMPORTANCE ARE THE RESULT OF TRIVIAL CAUSES
I WOULD RATHER BE FIRST IN A LITTLE IBERIAN VILLAGE THAN SECOND IN ROME
DANGER KNOWS FULL WELL THAT CAESAR IS MORE DANGEROUS THAN HE
#include <iostream>
#include <cstring>
using namespace std;
const int N=110;
char start[]="START";
char end[]="END";
char endinput[]="ENDINPUT";
char input[]="VWXYZABCDEFGHIJKLMNOPQRSTU";
int main(){
	char s[110];
	while(1){
		gets(s);
		if(strcmp(s,start)==0) continue;
		if(strcmp(s,end)==0) continue;
		if(strcmp(s,endinput)==0) break;
		for(int i=0;i<strlen(s);i++){
			if('A'<=s[i]&&s[i]<='Z'){
				s[i]=input[s[i]-'A'];//注意转换
			}
		}
		cout<<s<<endl;
	}
	return 0;
}

第四题 词典

【map字符串匹配】

输入
首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行。每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开。而且在词典中不会有某个外语单词出现超过两次。词典之后是一个空行,然后给出一个由外语单词组成的文档,文档不超过100000行,而且每行只包括一个外语单词。输入中出现单词只包括小写字母,而且长度不会超过10。
输出
在输出中,你需要把输入文档翻译成英文,每行输出一个英文单词。如果某个外语单词不在词典中,就把这个单词翻译成“eh”。
样例输入
dog ogday
cat atcay
pig igpay
froot ootfray
loops oopslay

atcay
ittenkay
oopslay
样例输出
cat
eh
loops
 

#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
//const int N=100010;
using namespace std;
int main(){
	map<string,string> dmp;
	string line,s1,s2;
	while(getline(cin,line)){
		if(line.length()==0){
			break;
		}
		else{
			int make=line.find(" ");
			s1=line.substr(0,make);
			s2=line.substr(make+1,line.length()-1);
			dmp[s2]=s1;
		}
	}
	map<string,string>::iterator it;
	while(getline(cin,line)){
		it=dmp.find(line);
		if(it!=dmp.end()){
			cout<<it->second<<endl;
		}
		else cout<<"eh"<<endl;
	}
return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值