zoukankan      html  css  js  c++  java
  • 【洛谷P1101】单词方阵

    题目大意:给一 (n imes n) 的字母方阵,内可能蕴含多个 (“yizhong”) 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。

    题解:首先每个单词摆放的方向要相同。因此,搜素对应的状态应为当前位置的坐标,需要比对的第几个字母和面朝哪个方向。搜索时因为一个字母可能被多个字符串公用,因此,不是很方便确定一个字母是否会不被打印,但是若经过这个字母可以组成单词,则表明该字母一定在输出时会被打印出来。所以,可以采用一个 vis[][] 数组表示该字母是否需要被打印即可。

    代码如下

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=110;
    
    char mp[maxn][maxn],s[maxn]="yizhong";
    int n;bool vis[maxn][maxn];
    
    void read_and_parse(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++)scanf("%s",mp[i]+1);
    }
    
    const int dx[]={0,0,1,1,1,-1,-1,-1};
    const int dy[]={1,-1,0,1,-1,0,1,-1};
    
    bool dfs(int x,int y,int dir,int idx){
    	if(idx==6)return vis[x][y]=1;
    	int xx=dx[dir]+x,yy=dy[dir]+y;
    	if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&mp[xx][yy]==s[idx+1]&&dfs(xx,yy,dir,idx+1))return vis[xx][yy]=1;
    	else return 0;
    }
    
    void solve(){
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=n;j++)
    			if(mp[i][j]=='y'){
    				for(int k=0;k<8;k++)
    					if(dfs(i,j,k,0))vis[i][j]=1;
    			}
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++)printf("%c",vis[i][j]?mp[i][j]:'*');
    		puts(""); 
    	}
    }
    
    int main(){
    	read_and_parse();
    	solve();
    	return 0;
    }
    
  • 相关阅读:
    [ML] the notes
    [Java] 在 jar 文件中读取 resources 目录下的文件
    [LeetCode] 53. Maximum Subarray 解题思路
    [git] git 分支管理和工作流程
    debug实战:Unmanaged High Memory非托管高内存
    batch insert 1 million datas into mysql
    nuget的小Tips
    debug实战:进程Hang+High CPU
    debug实战:COM组件GetToSTA导致高内存+GC被阻塞
    svn cleanup failed问题解决
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10185729.html
Copyright © 2011-2022 走看看