UVAL - 6755 - Swyper Keyboard

先上题目:

https://icpcarchive.ecs.baylor.edu/external/67/6755.pdf

题目复制起来比较麻烦。

 

  题意:定义一种操作:给出一个字符串,然后手指就按照给出的字符串的字符出现顺序不离开触摸屏那样移动,这样最后就会得到一个字符串(不一定等于给出的字符串),现在再给你一堆字符串,问你这些字符串根据给你的顺序,最先出现的是哪一个字符串是得到的那个字符串的子序列。如果没有出现的话就输出"NO SOLUTION"。

  做法:先求出那个字符串,然后再逐个逐个字符串找。关于怎样求这个字符串,说起来好像有点复杂,大概的做法就是在判断划过某两个字符的过程中会有哪些字符的时候,先缩小枚举的范围,然后对于范围里面的每一个字符都进行一次判断,判断的方法是使用叉积来判断,如果这个判断的字符的四个角不都在原来的那两个字符连成的线段的一侧的话说明就是穿过的(注意刚好在线上的情况)。具体实现看代码。

 

上代码:

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cmath>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <string>
  7 #define APH 26
  8 #define MAX 1002
  9 using namespace std;
 10 
 11 
 12 typedef struct Point{
 13     int x,y;
 14 
 15     Point(int x=0,int y=0):x(x),y(y){}
 16 
 17 }Point;
 18 typedef Point Vector;
 19 Vector operator + (Point A,Point B){ return Vector(B.x+A.x,B.y+A.y);}
 20 Vector operator - (Point A,Point B){ return Vector(B.x-A.x,B.y-A.y);}
 21 Vector operator * (Point A,int e){ return Point(A.x*e,A.y*e);}
 22 Vector operator / (Point A,int e){ return Point(A.x/e,A.y/e);}
 23 
 24 int Dot(Vector A,Vector B){ return A.x*B.x + A.y*B.y;}
 25 inline int Cross(Vector A,Vector B){ return A.x*B.y - A.y*B.x;}
 26 
 27 int cx[]={-1,1,1,-1};
 28 int cy[]={1,1,-1,-1};
 29 
 30 string path[APH][APH];
 31 Point pos[APH];
 32 char ch[APH][APH];
 33 
 34 Point getPoint(char c){
 35     if(c<='E') return Point(c-'A'+2,4);
 36     else{
 37         return Point((c-'F')%7+1,3-(c-'F')/7);
 38     }
 39 }
 40 
 41 bool check(Point A,Point B,Point C){
 42     bool b=0,l=0;
 43     A.x*=2; A.y*=2;
 44     B.x*=2; B.y*=2;
 45     C.x*=2; C.y*=2;
 46     Point u;
 47     for(int i=0;i<4;++i){
 48         u=Point(C.x+cx[i],C.y+cy[i]);
 49         if(Cross(A-u,B-u)>0) b|=1;
 50         if(Cross(A-u,B-u)<0) l|=1;
 51     }
 52     return b&&l;
 53 }
 54 
 55 string GetPath(int a,int b){
 56     string ans="";
 57     if(a==b) return ans;
 58     int ax=pos[a].x,ay=pos[a].y;
 59     int bx=pos[b].x,by=pos[b].y;
 60     for(int i= ax ; (ax < bx ? i<=bx : i>=bx) ; (ax < bx ? i++ : i--) ){
 61         for(int j= ay ; (ay < by ? j<=by : j>=by) ; (ay < by ? j++ : j--)){
 62             if(ch[i][j]==0) continue;
 63             if(check(pos[a],pos[b],pos[ch[i][j]-'A'])) ans+=ch[i][j];
 64         }
 65     }
 66     //if(ans.length()<=1) return "";
 67     ans = ans.substr(1,max((int)(ans.length()-2),0));
 68     //cout<<ans<<endl;
 69     return ans;
 70 }
 71 
 72 void prepare(){
 73     memset(ch,0,sizeof(ch));
 74     for(int i=0;i<APH;i++){
 75         pos[i]=getPoint('A'+i);
 76         ch[pos[i].x][pos[i].y]='A'+i;
 77 //        cout<<ch[pos[i].x][pos[i].y]<<" ";
 78     }
 79 //    cout<<endl;
 80     for(int i=0;i<APH;i++){
 81         for(int j=0;j<APH;j++){
 82             path[i][j]=GetPath(i,j);
 83 //            cout<<path[i][j]<<endl;
 84         }
 85     }
 86 }
 87 
 88 string connect(string st){
 89     string ans;
 90     ans+=st[0];
 91     for(unsigned int i=1;i<st.length();i++){
 92         ans+=path[st[i-1]-'A'][st[i]-'A'];
 93         ans+=st[i];
 94     }
 95     //ans+=st[st.length()-1];
 96     return ans;
 97 }
 98 
 99 bool check_str(string s,string str){
100     unsigned i,j;
101     for(i=0,j=0;i<s.length();i++){
102         if(s[i]==str[j]){
103             j++;
104             if(j==str.length()) return 1;
105         }
106     }
107     return 0;
108 }
109 
110 int main()
111 {
112     int t,n;
113     string st,s,str;
114     //freopen("data.txt","r",stdin);
115     ios::sync_with_stdio(false);
116     prepare();
117     cin>>t;
118     while(t--){
119         cin>>n>>st;
120         s=connect(st);
121         //cout<<"* "<<s<<endl;
122         bool f=0;
123         for(int i=0;i<n;i++){
124             cin>>str;
125             //cout<<str<<endl;
126             if(!f && check_str(s,str)){
127                 f=1;
128                 cout<<str<<endl;
129             }
130         }
131         if(!f) cout<<"NO SOLUTION"<<endl;
132     }
133     return 0;
134 }
/*6755*/

 

  

转载于:https://www.cnblogs.com/sineatos/p/3969014.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ransac算法简介

给定两个点p1与p2的坐标&#xff0c;确定这两点所构成的直线&#xff0c;要求对于输入的任意点p3&#xff0c;都可以判断它是否在该直线上。初中解析几何知识告诉我们&#xff0c;判断一个点在直线上&#xff0c;只需其与直线上任意两点点斜率都相同即可。实际操作当中&#xf…

2018年AI和ML(NLP、计算机视觉、强化学习)技术总结和2019年趋势

来源&#xff1a;网络大数据1、简介过去几年一直是人工智能爱好者和机器学习专业人士最幸福的时光。因为这些技术已经发展成为主流&#xff0c;并且正在影响着数百万人的生活。各国现在都有专门的人工智能规划和预算&#xff0c;以确保在这场比赛中保持优势。数据科学从业人员也…

HDU 2421

由算术基本定理Np1^e1*p2^e2....ps^es&#xff0c;可知一个素的因子个数为(e11)*(e21)*...*(es1)。 而N的一人因子必定也有np1^k1*p2^k2。。。。*ps^ks的形式。因子个数形式同上。 而事实上&#xff0c;即是从ei中选取其中一些来充当k1。那么&#xff0c;所有的因子的个数之和必…

仿射变换的原理

在条形码识别软件中有图像预览的功能。有时预览的图像需要进行转置&#xff08;旋转180度或者90度&#xff09;、缩放、镜像&#xff08;左右反转&#xff09;等操作。OpenCV提供了相应的函数进行以上操作。例如&#xff1a; 转置&#xff1a;cv::WarpAffine() 缩放&#xff…

拯救顽疾大作战!IDC绘中国医疗AI生态图谱,英伟达献医疗影像新杀器

来源&#xff1a;智东西摘要&#xff1a;中国千家医院部署AI系统&#xff01;IDC医疗AI报告详解行业趋势和五大药方。2018年是令人唏嘘的一年&#xff0c;台湾作家李敖、动画大师高畑勋、相声表演艺术家师胜杰、央视主持人李咏、微软联合创始人保罗艾伦、武侠小说宗师金庸等一个…

设计模式之适配器模式(Adapter Pattern)

在正式开始之前&#xff0c;让我们先思考几个问题&#xff1a; 如果现有的新项目可以利用旧项目里大量的遗留代码&#xff0c;你打算从头开始完成新项目还是去了解旧项目的模块功能以及接口&#xff1f;如果你了解过遗留代码之后&#xff0c;发现有几个重要的功能模块接口不同&…

错位排列-信封问题

五个编号为1~5的小球放进5个编号为1~5的小盒里面&#xff0c;全错位排列&#xff08;即1不放1&#xff0c;2不放2&#xff0c;依次类推&#xff09;一共有多少种放法 这是著名的信封问题,很多著名的数学家都研究过瑞士数学家欧拉按一般情况给出了一个递推公式&#xff1a; 用A…

存在描述所有生命的方程吗?

○ 生物体既复杂又有序&#xff0c;就像这片亚麻茎的横截面。研究人员希望最终发展出描述所有生命的基本方程。来源&#xff1a;原理关于生命&#xff0c;没有什么是简单的。每一秒钟&#xff0c;都有数百万个缜密有序的化学反应发生在一个细胞内&#xff1b;数十亿个单细胞生物…

asp.net(C#)写SQL语句技巧

/*添加SQL*/string fields "";string values "";fields "xm"; values "" Request.Form["xm"].ToString() "";fields ",xb"; values "," Request.Form["xb"].ToString() …

Python函数参数值传递

Python的函数参数是通过值传递的&#xff0c;但是如果变量是可变对象&#xff0c;返回到调用程序后&#xff0c;该对象会呈现被修改后的状态 测试程序如下&#xff1a; # 值传递不改变变量 def addInterest(balance, rate):newBalance balance * (1rate)return newBalance de…

CSS3滤镜

今天在办公室亲眼目睹了同事使用CSS3滤镜为一张漂亮的照片轮廓加上了阴影&#xff0c;瞬间亮瞎了我的的双眼&#xff0c;见笑了。 所以也迅速尝试使用CSS3滤镜让最新出炉的MUI LOGO也性感一把&#xff0c;试图来愉悦一下大家的双眼。已经等不及了&#xff0c;赶紧奉上今天的测试…

Python中递归字符串反转

我们可以用Python轻松的反转字符串&#xff0c;代码如下&#xff1a; def reverse(s):if s :return selse:return reverse(s[1:]) s[0]print(reverse(hello))运行结果如下&#xff1a;Connected to pydev debugger (build 143.1559) ollehProcess finished with exit code 0

全面认识“边缘云”,中国首份边缘云白皮书发布

来源&#xff1a;中国电子技术标准化研究院、阿里云摘要&#xff1a;《边缘云计算技术与标准化白皮书》近期发布&#xff0c;定义了边缘云计算的概念和标准等。中心云和边缘云相互配合&#xff0c;实现中心-边缘协同、全网算力调度、全网统一管控等能力&#xff0c;真正实现“无…

Python中异常处理

Python使用try...except...来处理异常&#xff0c;当Python遇到一个try语句&#xff0c;他会尝试执行try语句体内的语句&#xff0c;如果执行这些语句没有错误&#xff0c;控制转移到try...except...后面的语句&#xff0c;如果语句体内发生错误&#xff0c;python会寻找一个符…

【Tech】Mac上安装MAMP打开本地网页

不知道为什么实验室老是用些奇葩的东西&#xff0c;这次是madserve&#xff0c;主要是用来统计移动端广告点击率的&#xff0c;基于PHP/MYSQL实现。 昨天很快在Windows上搭好一个xampp&#xff0c;并用它建立了一个virtual host把madserve跑起来了。但是在mac上xampp建立virtua…

中国10大最震撼的无人工厂,你吃的用的都是这么来的!

来源&#xff1a;工业机器人摘要&#xff1a;你吃的用的那么多东西&#xff0c;早已不是“人造”的&#xff01;1.上海通用金桥工厂&#xff1a;386台机器人图中展示的是上海通用金桥工厂。这里号称中国最先进的制造业工厂、中国智造的典范。即使从全球来看&#xff0c;这个水平…

图像拼接2 特征匹配

特征匹配旨在从两幅图像所提取的特征集中寻找对应关系&#xff0c;匹配过程是从前面的图像特征描述符的相似性来进行判断。 判断两个图像特征集中的特征点的相似程度存在两种基本方式&#xff1a; 1&#xff1a;给定阈值&#xff0c;即从特征集中找出所有与待匹配点距离小于阈…

状态压缩 之 UVA 10944 - Nuts for nuts..

// [9/19/2014 Sjm] /* dis[j][k] : 从 j 点到 k 点的最少步数&#xff0c;由于They can travel in all 8 adjacent direction in one step.故而 dis[j][k] max( abs(Xj - Xk), abs(Yj - Yk) )f[j][i] : 在 i 状态下&#xff0c;最后收集坚果 j 的最少步数n 代表坚果的数目。…

对人工神经网络“开刀”,利用神经科学消融法检测人工神经网络

来源&#xff1a;DeepTech深科技摘要&#xff1a;当谈及人工神经网络&#xff0c;黑箱问题总会引起热议&#xff0c;人们对黑箱问题的评价褒贬不一。有人认为黑盒是神经网络的优势&#xff0c;这代表神经网络的自主学习性&#xff0c;代表其自动学习以及自动完善的特性。但大部…

wp8数据存储--独立存储文件 【转】

出自 &#xff1a; http://www.cnblogs.com/MyBeN/p/3339019.html 文章篇幅有点大&#xff0c;建议去源网看看 1.调用手机的独立存储 例如&#xff1a;IsolatedStorageFile storage IsolatedStorageFile.GetUserStoreForApplication() 2.创建独立存储文件流 例如&#xff1a;I…