UVA - 10010 Where's Waldorf?
来源:互联网 发布:gm3188写频软件 编辑:程序博客网 时间:2024/06/05 23:46
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18656
也是一道基础题,让你在一个N×M的矩阵中查找一个给定的字符串,可以分八个方向查找,输出找到的字符串首字母在矩阵中的位置,至少保证矩阵中存在一个要查找的字符串,如果有多个输出最左上的位置即可。
开始 用dfs感觉不太好写,后来就直接用循环搞了,直接枚举八个方向去判断,满足即输出。’
#include <iostream>#include <cstdio>#include <cmath>#include <vector>#include <cstring>#include <string>#include <algorithm>#include <string>#include <set>#include <functional>#include <numeric>#include <sstream>#include <stack>#include <map>#include <queue>#define CL(arr, val) memset(arr, val, sizeof(arr))#define ll long long#define inf 0x7f7f7f7f#define lc l,m,rt<<1#define rc m + 1,r,rt<<1|1#define pi acos(-1.0)#define L(x) (x) << 1#define R(x) (x) << 1 | 1#define MID(l, r) (l + r) >> 1#define Min(x, y) (x) < (y) ? (x) : (y)#define Max(x, y) (x) < (y) ? (y) : (x)#define E(x) (1 << (x))#define iabs(x) (x) < 0 ? -(x) : (x)#define OUT(x) printf("%I64d\n", x)#define lowbit(x) (x)&(-x)#define Read() freopen("a.txt", "r", stdin)#define Write() freopen("dout.txt", "w", stdout);#define N 100005using namespace std;int dir[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};int main(){ //Read(); int t,n,m,p,i,j,a,b,flag,x; char s[55][55],str[55]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); getchar(); for(i=0;i<n;i++) { scanf("%s",s[i]); for(j=0;j<m;j++) { if(s[i][j]>='A'&&s[i][j]<='Z') s[i][j]+=32; } } scanf("%d",&p); getchar(); while(p--) { scanf("%s",str); int l=strlen(str); for(i=0;i<l;i++) { if(str[i]>='A'&&str[i]<='Z') str[i]+=32; } flag=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(s[i][j]==str[0]) { int t1=i,t2=j; int xx,yy; xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[0][0]; yy=yy+dir[0][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) { printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[1][0]; yy=yy+dir[1][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[5][0]; yy=yy+dir[5][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[2][0]; yy=yy+dir[2][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[3][0]; yy=yy+dir[3][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[4][0]; yy=yy+dir[4][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[6][0]; yy=yy+dir[6][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} xx=t1;yy=t2; for(x=1;x<l;x++) { xx=xx+dir[7][0]; yy=yy+dir[7][1]; if(xx<0||xx>=n||yy<0||yy>=m||s[xx][yy]!=str[x]) break; } if(x==l) {printf("%d %d\n",t1+1,t2+1);flag=1;break;} } } if(flag) break; } } if(t) printf("\n"); } return 0;}
上面写的还是太繁琐了,后来参考了别人写的,可以把内层的八个for循环转换成一个函数,其余基本差不多,但是简洁了很多。
#include<cstdio>#include<cstring>#include<ctype.h>#define M 55char s[M][M];int dir[8][2]={-1,-1,-1,0,-1,1,0,1,1,1,1,0,1,-1,0,-1};int n,m,flag;void dfs(char *str,int len,int p,int k,int x,int y){ //printf("%s %d %d %d %d %d\n",str,len,p,k,x,y); if(k==len) {flag=1; return;} x=x+dir[p][0];y=y+dir[p][1]; if(x>=0&&x<n&&y>=0&&y<m&&s[x][y]==str[k]) { dfs(str,len,p,k+1,x,y); } return;}int main(){ //freopen("a.txt","r",stdin); int t,i,j,k,p; char str[M]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); getchar(); for(i=0;i<n;i++) { scanf("%s",s[i]); for(j=0;j<m;j++) { if(isupper(s[i][j])) s[i][j]=tolower(s[i][j]); } } scanf("%d",&p); getchar(); while(p--) { flag=0; scanf("%s",str); int l=strlen(str); for(i=0;i<l;i++) { if(isupper(str[i])) str[i]=tolower(str[i]); } for(i=0;i<n;i++) { for(j=0;j<m;j++) { for(k=0;k<8;k++) { if(s[i][j]==str[0]) { //printf("%c\n",s[i][j]); int x=i,y=j; dfs(str,l,k,1,x,y); if(flag) {printf("%d %d\n",i+1,j+1);break;} } } if(flag) break; } if(flag) break; } } if(t) printf("\n"); } return 0;}
0 0
- UVa 10010 - Where's Waldorf?
- uva 10010 Where's Waldorf?
- UVa 10010 - Where's Waldorf?
- UVa 10010 - Where's Waldorf?
- uva-10010 - Where's Waldorf?
- UVA 10010 - Where's Waldorf?
- UVa 10010 - Where's Waldorf?
- UVa 10010 - Where's Waldorf?
- UVA 10010 Where's Waldorf?
- UVa 10010: Where's Waldorf?
- UVA 10010 Where's Waldorf?
- UVa - 10010 - Where's Waldorf?
- UVA 10010 Where's Waldorf?
- uva 10010 - Where's Waldorf?
- uva 10010 Where's Waldorf?
- uva - 10010 - Where's Waldorf?
- UVa 10010 - Where's Waldorf?
- UVA - 10010 - Where's Waldorf
- Domino实现外网邮件转发功能配置
- Problem E: Matrix Problem : Array Practice
- Android Studio 快捷键整理分享-SadieYu
- Android 屏幕适配
- java多线程之其他知识简介
- UVA - 10010 Where's Waldorf?
- UART与COM口之区别
- Java 理论与实践: 处理 InterruptedException
- Camera 涉及的文件70
- EasyUI 的DataGrid中DateTime的格式化问题
- 黑马程序员 Java基础 集合框架之Map
- 遍历Map
- webpower携手穷游,解析大数据、营销智能化与用户的关系
- 不开源的免费软件其实危机重重!很多是木马,进入捆绑安装模式