题解 P1101 【单词方阵】

teafrogsf

2016-11-14 23:46:47

Solution

做到一半发现不是搜索是枚举...... 于是我就用枚举做了23333 基本想法是**先循环找y然后八个边找i,按这条直线枚举,若确实是yizhong就标记**; 输出的时候按标记输出就可以了。 顺便说一句,**不能用getchar吞换行**,用个字符串吧XD 上代码 ```cpp #include<stdio.h> char a[110][110]; int dx[10]={0,-1,1,0,0,-1,-1,1,1},dy[10]={0,0,0,-1,1,-1,1,-1,1},flag[110][110],n; bool book[110][110]; char yz[10]={0,'i','z','h','o','n','g'}; void dfs(int x,int y) { int i,j; int xx=x,yy=y; for(i=1;i<=8;) { xx=x+dx[i];yy=y+dy[i]; //printf("%d %d %c\n",xx,yy,a[xx][yy]); if(a[xx][yy]=='i'&&xx>=1&&xx<=n&&yy>=1&&yy<=n) { if(x+6*dx[i]<1||x+6*dx[i]>n||y+6*dy[i]<1||y+6*dy[i]>n)goto next; for(j=2;j<=6;j++) { //printf("%d %d %c\n",x+j*dx[i],y+j*dy[i],a[x+j*dx[i]][y+j*dy[i]]); if(a[x+j*dx[i]][y+j*dy[i]]!=yz[j])goto next; } for(j=0;j<=6;j++)flag[x+j*dx[i]][y+j*dy[i]]=1; } next: i++; } } int main() { int i,j; char instead[110]; scanf("%d",&n); for(i=1;i<=n;i++) { gets(instead); for(j=1;j<=n;j++)scanf("%c",&a[i][j]); } for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i][j]=='y')dfs(i,j); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(flag[i][j])printf("%c",a[i][j]); else printf("*"); } puts(""); } return 0; } ```