华师一附中OI组
标题:
P1101 单词方阵
[打印本页]
作者:
admin
时间:
2018-5-18 15:01
标题:
P1101 单词方阵
https://www.luogu.org/problemnew/show/P1101
题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间
可以
交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数n。(7<=n<=100)。
第二行开始输入nXn的字母矩阵。
输出格式:
突出显示单词的nXn矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******
作者:
YTC
时间:
2018-5-20 16:52
#include<iostream>
using namespace std;
string st="yizhong";
int p;
char a[105][105];
bool b[105][105];
char c[105][105];
int dx[8]={-1,0,1,-1,1,-1,0,1};
int dy[8]={1,1,1,0,0,-1,-1,-1};
void mysearch(int i,int j,int n,int k)
{
//if(i<=0||i>n||j<=0||j>n) return;
if(n>=7)
{
for(int ii=1;ii<=p;ii++)
for(int jj=1;jj<=p;jj++)
if(b[ii][jj]) c[ii][jj]=a[ii][jj];
}
else
if(n==0)
if(a[i][j]==st[n])
{
b[i][j]=true;
for(int k=1;k<=8;k++)
mysearch(i+dx[k],j+dy[k],n+1,k);
b[i][j]=false;
}
if(n>0&&n<7)
{
if(a[i][j]==st[n])
{
b[i][j]=true;
mysearch(i+dx[k],j+dy[k],n+1,k);
b[i][j]=false;
}
}
}
int main()
{
cin>>p;
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
cin>>a[i][j];
for(int i=1;i<=p;i++)
for(int j=1;j<=p;j++)
mysearch(i,j,0,0);
for(int i=1;i<=p;i++)
{
for(int j=1;j<=p;j++)
{
if(c[i][j]) cout<<c[i][j];
else cout<<'*';
}
cout<<endl;
}
return 0;
}
作者:
admin
时间:
2018-5-20 20:25
很好!!!但是 105 请定义为常数 方向数组请写+1 -1 +0 以对齐
作者:
黄煦喆
时间:
2018-5-26 19:03
#include<iostream>
#include<map>
using namespace std;
int n;
char a[102][102];
char b[102][102];
int gx[9]= {0,-1,-1,-1,+0,+1,+1,+1,+0};
int gy[9]= {0,-1,+0,+1,+1,+1,+0,-1,-1};
map<char,char>m;
void check(int x,int y,int dir,int s)
{
if(s==0)return;
else
{
b[x][y]=a[x][y];
int kx=x-gx[dir];
int ky=y-gy[dir];
check(kx,ky,dir,s-1);
}
}
void ms(int x,int y,int dir,int s)
{
if(s==7&&a[x][y]=='g')check(x,y,dir,s);
int tx=x+gx[dir];
int ty=y+gy[dir];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]==m[a[x][y]])
{
ms(tx,ty,dir,s+1);
}
}
int main()
{
cin>>n;
m.insert(make_pair('y','i'));
m.insert(make_pair('i','z'));
m.insert(make_pair('z','h'));
m.insert(make_pair('h','o'));
m.insert(make_pair('o','n'));
m.insert(make_pair('n','g'));
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)cin>>a[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(a[i][j]=='y')
for(int k=1; k<=8; k++)ms(i,j,k,1);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
if(b[i][j]>='a'&&b[i][j]<='z')cout<<b[i][j];
else cout<<'*';
cout<<endl;
}
return 0;
}
复制代码
作者:
胡雨菲菲
时间:
2018-6-5 13:49
#include <cstdio>
#include <iostream>
using namespace std;
///yizhong 7
int n;
bool b[103][103];
char a[103][103];
char kk[8]={'.','y','i','z','h','o','n','g'};
int fuzhu[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{0,-1},{-1,-1},{-1,0}};
///y
///i
///记录方向k
void su(int p,int q,int x,int y)
{
for(int i=0;i<=6;i++)
{
b[p+i*x][q+i*y]=true;
}
return;
}
void xiuxi(int p,int q,int step,int x,int y)
{
if(step==7)
{
su(p,q,x,y);
return;
}
if(p+x*step>=n || p+x*step<0 || q+y*step>=n || q+y*step<0) return;
if(a[p+x*step][q+y*step]==kk[step+1])
{
xiuxi(p,q,step+1,x,y);
}
else return;
return;
}
void sou1(int p,int q)
{
for(int i=0;i<=7;i++)
{
int x=fuzhu[i][0];
int y=fuzhu[i][1];
if(p+x<n && q+y>=0 && p+x>=0 && q+y<n)
{
if(a[p+x][q+y]=='i')
{
xiuxi(p,q,1,x,y);
}
}
}
return;
}
void nowgo()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='y')
{
sou1(i,j);
}
}
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
nowgo();
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
///printf("%d",b[i][j]);
if(b[i][j]) printf("%c",a[i][j]);
else printf("*");
}
printf("\n");
}
return 0;
}
复制代码
作者:
admin
时间:
2018-6-5 15:28
楼上罗同学,我为什么要你们把自己的程序写出来呢?你看我来评点你的程序:
有很多不必要的{} 到处是return 不结构化!
你的这一段:
bool b[103][103];
char a[103][103];
char kk[8]={'.','y','i','z','h','o','n','g'};
int fuzhu[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{0,-1},{-1,-1},{-1,0}};
复制代码
写成我这样的你觉得如何?
const int mm=103;
bool b[m][m];
char a[m][m];
string kk=".yizhong";
int fuzhu[8][2]={-1,-1,-1,+0,+0,+1,+1,+1,
-1,+0,+1,-1,+1,-1,+0,+1}
复制代码
作者:
张笑宇
时间:
2018-6-11 22:55
搜索
“y”
#include<iostream>
using namespace std;
char m[9]=" yizhong";
char a[110][110];
bool b[110][110];
int n,i,j,x[10010],y[10010],t;
int dx[10]= {0,-1,+0,+1,+1,+1,+0,-1,-1};
int dy[10]= {0,+1,+1,+1,+0,-1,-1,-1,+0};
int main()
{
cin>>n;
t=0;
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
cin>>a[i][j];
if (a[i][j]=='y')
{
t++;
x[t]=i;
y[t]=j;
}
}
for (int it=1; it<=t; it++) ///搜索‘y’
{
int xx=x[it],yy=y[it];///'y'坐标(x[it],y[it]);
for (i=1; i<=8; i++) ///8个方向搜索i
{
bool bb=true;
int sx=xx,sy=yy;///sx,sy计数 到第几位了
for (j=1;j<=6;j++)
{
sx=sx+dx[i];
sy=sy+dy[i];
if (sx<1||sx>n||sy<1||sy>n||a[sx][sy]!=m[j+1]) bb=false;
}
if (bb)
{
for (j=0;j<=6;j++)
{
b[sx][sy]=true;///回溯标记
sx=sx-dx[i];
sy=sy-dy[i];
}
}
}
}
for (i=1;i<=n;i++)
{
for (j=1;j<=n;j++)
{
if (b[i][j]) cout<<a[i][j];
else cout<<"*";
}
cout<<endl;
}
return 0;
}
复制代码
作者:
universehyf
时间:
2018-9-15 23:24
#include<iostream>
using namespace std;
string s[110],ans[110];
#define FOR(iii,nn,m) for(int iii=nn;iii<=m;iii++)
int dr[8]={-1,-1,-1,0,0,1,1,1};
int dc[8]={-1,0,1,-1,1,-1,0,1};
int n,tr,tc;
int main()
{
cin>>n;
FOR(i,0,n-1)
cin>>s[i];
FOR(i,0,n-1) FOR(j,0,n-1)
ans[i]+='*';
FOR(i,0,n-1) FOR(j,0,n-1)
if(s[i][j]=='y')
{
FOR(k,0,7)
{
tr=i;tc=j;bool bb=true;
FOR(kk,1,6)
{
tr+=dr[k];tc+=dc[k];
if(tr<0||tc<0||tr>=n||tc>=n) {bb=0;break;}
if(kk==1&&s[tr][tc]!='i') {bb=0;break;}
if(kk==2&&s[tr][tc]!='z') {bb=0;break;}
if(kk==3&&s[tr][tc]!='h') {bb=0;break;}
if(kk==4&&s[tr][tc]!='o') {bb=0;break;}
if(kk==5&&s[tr][tc]!='n') {bb=0;break;}
if(kk==6&&s[tr][tc]!='g') {bb=0;break;}
}
if(bb)
{
tr=i;tc=j;
FOR(kk,0,6){ans[tr][tc]=s[tr][tc];tr+=dr[k];tc+=dc[k];}
}
}
}
FOR(i,0,n-1)
{FOR(j,0,n-1)cout<<ans[i][j];cout<<endl;}
return 0;
}
复制代码
作者:
type尧
时间:
2018-11-4 18:55
//
#include<bits/stdc++.h>
#define maxn 110
using namespace std;
int n;
char ch[maxn][maxn];
string ss="yizhong";
bool book[maxn][maxn];
int move[8][2]={{-1,-1},{-1,0},{1,0},{1,1},{0,1},{0,-1},{-1,1},{1,-1}};
int sx[7];
int sy[7];
int xy[maxn*maxn];
int xx[maxn*maxn];
int k;
bool f=0;
void getdata()
{
k=-1;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>ch[i][j];
if(ch[i][j]=='y'){
k++;
xx[k]=i;
xy[k]=j;
}
}
return;
}
void mark()
{
for(int i=0;i<=6;i++)
book[sx[i]][sy[i]]=1;
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
return;
}
void dfs(int x,int y,int t,int s)
{
if(x<0|x>n+1||y<0||y>n+1) {
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
return;
}
if(t==7){
mark();
return;
}
if(ch[x][y]!=ss[t]) {
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
return;
}
sx[t]=x;
sy[t]=y;
dfs(x+move[s][0],y+move[s][1],t+1,s);
return;
}
void print()
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(book[i][j])
cout<<ch[i][j];
else cout<<"*";
cout<<endl;
}
return;
}
int main()
{
getdata();
for(int i=0;i<=k;i++){
for(int j=0;j<8;j++)
dfs(xx[i],xy[i],0,j);
}
print();
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2