欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2020年3月28日UCF Local Programming Contest 2016

程序员文章站 2022-04-15 13:41:07
A. Majestic 10 题意:给你三个数,要你判断三个数中有多少个数是大鱼等于10的,并根据数量打印相关输出即可 题解:这是一道简单的签到题,简单。 代码: 1 #include 2 #include 3 #include 4 #de ......

a. majestic 10

题意:给你三个数,要你判断三个数中有多少个数是大鱼等于10的,并根据数量打印相关输出即可

题解:这是一道简单的签到题,简单。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 int main(){
 7     ll n;
 8     cin>>n;
 9     while(n--){
10         int num=0,t;
11         int cnt[3]={0},tt=0; 
12         for(int i=0;i<3;i++){  
13             cin>>t;
14             cnt[tt++]=t;
15             if(t>=10){
16                 num++;
17             }
18         }
19         for(int i=0;i<tt;i++){
20             cout<<cnt[i];
21             if(i<tt-1){
22                 cout<<" ";
23             }else{
24                 cout<<endl;
25             }
26         }
27         if(num==0){
28             cout<<"zilch"<<endl;
29         }else if(num==1){
30             cout<<"double"<<endl;
31         }else if(num==2){
32             cout<<"double-double"<<endl;
33         }else{
34             cout<<"triple-double"<<endl;
35         }
36         cout<<endl;
37     }
38     return 0;
39 } 

b. phoneme palindromes

题意:大概意思就是要你判断题目给出的两个字符串是不是回文串,但又有点创新,就是给出了即使两个字不同也可将其视为是相同的,这个下面的输入会给出那两个字母符合这一特性

题解:根据常规的回文串判断方法来判断即可,在遇到如果不是回文串的时候,可将两个字符串中的有“歧义”的字母都进行替换再进行比较即可。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<map>
 4 #include<algorithm>
 5 using namespace std;
 6 #define ll long long
 7 int main(){    
 8     ll n,p,q;
 9     string ptr1;
10     char c1,c2;
11     cin>>n;
12     int num=1;
13     while(n--){
14         cin>>p;
15         map<char,char> mp;
16         for(int i=0;i<p;i++){
17             cin>>c1>>c2;
18             mp[c1]=c2;
19         }
20         cin>>q;
21         cout<<"test case #"<<num<<":"<<endl;
22         num++;
23         for(int i=0;i<q;i++){//这是判断的 
24             cin>>ptr1;
25             string pr=ptr1;//原始 
26             string ptr2(ptr1.rbegin(),ptr1.rend());
27             if(ptr1==ptr2){
28                 cout<<pr<<" "<<"yes"<<endl;
29             }else{
30                 for(int j=0;j<ptr2.length();j++){
31                     if(mp.count(ptr2[j])!=0){//表示存在 
32                         ptr2[j]=mp[ptr2[j]];
33                     }
34                 }
35                 for(int j=0;j<ptr1.length();j++){
36                     if(mp.count(ptr1[j])!=0){
37                         ptr1[j]=mp[ptr1[j]];
38                     }
39                 }
40                 if(ptr1==ptr2){
41                     cout<<pr<<" "<<"yes"<<endl;
42                 }else{
43                     cout<<pr<<" "<<"no"<<endl;
44                 }
45             }
46         }
47         cout<<endl;
48     }
49     return 0;
50 }

c. don't break the ice

题意:大概意思就是给你一个充满冰块的棋盘,你可以对其中任何一个冰块进行敲击,冰块回随之掉落,但它的掉落会是一个连锁反应,他旁边的冰块也会掉落,除非旁边的冰块是在一个完整的行或列中,而掉落的这个冰块同样也会以同样的机理影响其他的冰块,想要你求下面给出的操作步骤有几个是多余的。

题解:这一题的意思比较简单,简单暴力模拟整个过程即可,但这个过程比较复杂,细心即可。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 #define ll long long
 6 ll d,n,x,y; 
 7 ll num[100][100]={0};
 8 int net[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
 9 bool check(int dx,int dy){
10     return (dx>=1&&dy<=d)&&(dy>=1&&dy<=d);    
11 } 
12 int main(){
13     ll n;//样例的数量
14     cin>>n;
15     int g=1;
16     while(n--){
17         cin>>d>>n;
18         for(int i=1;i<=d;i++){
19             for(int j=1;j<=d;j++){
20                 num[i][j]=1;
21             }
22         }//初始化为  1  表示这个位置还有冰块 
23         ll sum=0;//存储答案 
24         for(int i=0;i<n;i++){//输入每一次的操作 
25             cin>>x>>y;
26             if(num[x][y]==0){//本次操作无效 
27                 sum++;
28             }else{//本次操作是有效的 
29                 num[x][y]=0;//表示这一个冰块回掉下去 ,是以它为中心开始掉落的 
30                 //但是它会影响它周围的冰块
31                 for(int j=0;j<4;j++){
32                     int dx=x+net[j][0];
33                     int dy=y+net[j][1];
34                     if(check(dx,dy)&&num[dx][dy]==1){
35                         if(j==0){//向右移动 
36                             for(int r=dy;r<=d;r++){
37                                 int ff=0;
38                                 for(int rr=1;rr<=d;rr++){
39                                     if(num[rr][r]==1){
40                                         ff++;
41                                     }
42                                 }
43                                 if(ff==d){}
44                                 else {//不完整 
45                                     num[dx][r]=0;
46                                 }
47                             }
48                         }else if(j==1){//向左移动 
49                             for(int r=dy;r>=1;r--){
50                                 int ff=0;
51                                 for(int rr=1;rr<=d;rr++){
52                                     if(num[rr][r]==1){
53                                         ff++;
54                                     }
55                                 }
56                                 if(ff==d){}
57                                 else{//不完整 
58                                     num[dx][r]=0;
59                                 }
60                             }
61                         }else if(j==2){//向上移动 
62                             for(int r=dx;r<=d;r++){
63                                 int ff=0;
64                                 for(int rr=1;rr<=d;rr++){
65                                     if(num[r][rr]==1){
66                                         ff++;
67                                     }
68                                 }
69                                 if(ff==d){}
70                                 else{
71                                     num[r][dy]=0;
72                                 }
73                             }
74                         }else if(j==3){//向下移动 
75                             for(int r=dx;r>=1;r--){
76                                 int ff=0;
77                                 for(int rr=1;rr<=d;rr++){
78                                     if(num[r][rr]==1){
79                                         ff++;
80                                     }
81                                 }
82                                 if(ff==d){}
83                                 else{//不完整 
84                                     num[r][dy]=0;
85                                 }
86                             }
87                         }
88                     }
89                 }
90             }
91         }
92         cout<<"strategy #"<<g<<": "<<sum<<endl;
93         g++;
94         cout<<endl;
95     } 
96     return 0;
97 }

e. loopy word search

题意:题意比较简单,就是要你寻找一个字符串在题目所给的字母“矩阵”中第一个字母出现的位置和方向

题解:这一题也可一简单暴力模拟这个过程,唯一的技巧就是可以对题目给出的字母“矩阵”进行翻转以达到扩大字符串长度的目的,当让扩充的长度是多少要根据题目的具体要求来,这里我将它扩大到长度为10000的字符串

2020年3月28日UCF Local Programming Contest 2016

代码:

  1 #include<iostream>
  2 #include<cstring>
  3 #include<algorithm>
  4 using namespace std;
  5 #define ll long long
  6 int main(){
  7     ll n;
  8     cin>>n;
  9     ll r,c; 
 10     string arr;
 11     ll num;
 12     int g=1;
 13     while(n--){//字谜的个数 
 14         scanf("%d %d",&r,&c);//行和列
 15         char ptr[100][100];
 16         for(int i=1;i<=r;i++){
 17             for(int j=1;j<=c;j++){
 18                 cin>>ptr[i][j];
 19             }
 20         }
 21         string ar[100],ac[100];
 22         int    ir=1,   ic=1;
 23         for(int i=1;i<=r;i++){//这里将行连成串 ,并且用一个数组存起来 
 24             string temp;
 25             for(int j=1;j<=c;j++){
 26                 temp=temp+ptr[i][j];
 27             }
 28             ar[ir++]=temp;
 29         }
 30         for(int i=1;i<=c;i++){//这里将列连成串  并且用一个数组存起来 
 31             string temp;
 32             for(int j=1;j<=r;j++){
 33                 temp=temp+ptr[j][i];
 34             }
 35             ac[ic++]=temp;
 36         }
 37         cin>>num;
 38         cout<<"word search puzzle #"<<g<<":"<<endl;
 39         g++;
 40         for(int i=0;i<num;i++){
 41             cin>>arr;
 42             int front=0;//记录寻找的方向是那个
 43             int x,y;//第一个字母出现的坐标 
 44             int f=0;//是否找到的标记
 45             if(f==0){//行  顺   
 46                 for(int j=1;j<ir;j++){//遍历每一个行元素 
 47                     string temp;
 48                     while(temp.length()<=10000){
 49                         temp=temp+ar[j];
 50                     }
 51                     //下面开始寻找
 52                     int dis=temp.find(arr);
 53                     if(dis!=-1){//找到 下面就是要记录第一个位置出现的 行 和 列的坐标 
 54                         x=j;
 55                         y=dis+1;
 56                         f=1;//标记找到
 57                         front=1;//向右 
 58                         break; 
 59                     }else{}//表示没有找到 
 60                 }
 61             } 
 62             if(f==0){//行 逆 
 63                 for(int j=1;j<ir;j++){//遍历每一个行元素 
 64                     string temp;
 65                     string s(ar[j].rbegin(),ar[j].rend());
 66                     while(temp.length()<=10000){
 67                         temp=temp+s;
 68                     }
 69                     int dis=temp.find(arr);
 70                     if(dis!=-1){//找到  下面的难点就是记录出现的位置 
 71                         x=j;
 72                         y=s.length()-1-dis+1;
 73                         f=1;
 74                         front=2;//向左 
 75                         break;
 76                     }else{}//没有 
 77                 }
 78             }
 79             if(f==0){//列 顺(从上往下) 
 80                 for(int j=1;j<ic;j++){//遍历每一个列元素 
 81                     string temp;
 82                     while(temp.length()<=10000){
 83                         temp=temp+ac[j];
 84                     }
 85                     int dis=temp.find(arr);
 86                     if(dis!=-1){//找到  现在主要是要确定行和列的坐标 
 87                         x=dis+1;
 88                         y=j;
 89                         front=3;//向下 
 90                         f=1;
 91                         break;
 92                     }else{}//没找到 
 93                 } 
 94             } 
 95             if(f==0){//列 逆 (从下往上) 
 96                 for(int j=1;j<ic;j++){//遍历每一个 
 97                     string temp;
 98                     string s(ac[j].rbegin(),ac[j].rend());
 99                     while(temp.length()<=10000){
100                         temp=temp+s;
101                     }
102                     int dis=temp.find(arr);
103                     if(dis!=-1){//找到 现在主要确定第一个字母的行和列 
104                         x=s.length()-1-dis+1;
105                         y=j;
106                         f=1;
107                         front=4;//向下 
108                         break;
109                     }else{}//没找到 
110                 }
111             } 
112             if(front==1) cout<<"r ";
113             if(front==2) cout<<"l ";
114             if(front==3) cout<<"d ";
115             if(front==4) cout<<"u ";
116             cout<<x<<" "<<y<<" ";
117             cout<<arr<<endl;
118         }//数据输入完毕,下面开始处理数据
119         cout<<endl;
120     }
121     return 0;
122 }