1. 程式人生 > >洛谷 P1101 單詞方陣

洛谷 P1101 單詞方陣

個數 算法 span dfs include space == tchar IT

不算搜索的搜索

思路和很多人的一樣,因為只要找到兩個字母,方向就確定了,記錄下方向,剩下的暴力即可。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int fx[9][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//存方向,循環起來比較方便 
char map[101][101], word[8]={‘!‘,‘y‘,‘i‘,‘z‘,‘h‘,‘o‘,‘n‘,‘g‘};//word存需要比對的字母 
bool a[101][101];//記錄單詞的位置 int jl[10][2],k; //jl用來存字母的坐標,當七個字母全找完統一賦值 //k用來存方向 void dfs(int x,int y,int z) { if(z==1) { for(int m=1;m<=8;m++)//枚舉方向 { if(map[x+fx[m][0]][y+fx[m][1]]==word[2])//兩個字母確定方向 { k=m; //記錄方向 jl[z][0
]=x,jl[z][1]=y; //存坐標 dfs(x+fx[k][0],y+fx[k][1],2); //向下尋找 } } } int tot=1; //記錄匹配的字母個數 for(int m=2;m<=7;m++) { if(map[x+(m-2)*fx[k][0]][y+(m-2)*fx[k][1]]==word[m]) //不斷向下匹配 { tot=m; jl[m][0]=x+(m-2)*fx[k][0]; //記錄坐標
jl[m][1]=y+(m-2)*fx[k][1]; } else break; } if(tot==7) //如果字母全部匹配 { for(int w=1;w<=7;w++) { a[jl[w][0]][jl[w][1]]=1; //統一賦值 } } } int main() { //輸入,防止意外,用getchar()讀掉換行符 scanf("%d",&n); getchar(); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>map[i][j]; } getchar(); } //算法主體 for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(map[i][j]==‘y‘) { dfs(i,j,1); } } //輸出 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]) printf("%c",map[i][j]); else printf("*"); } cout<<endl; } return 0; }

洛谷 P1101 單詞方陣