洛谷P1101单词方阵题解

P1101题目链接

想获得更好的观看体验,请在博客内查看

先说一下我的思路吧:

  1. 找出首字母Y
  2. 找出字母Y旁边的I,记录其扩展方向
  3. 依次检查沿Y向I方向的字母
  4. 若至字母G时无误记录下其单词扩展路径
  5. 输出合法的单词**

预定义:

char s[105][105];
const string key="yizhong";

int n,idx[105][105]{}; //c++11用法,把idx数组全部初始化为0
//idx[i][j]=1 代表可成为单词,s表示原方阵,key为单词

主函数

int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++)	scanf("%s",&s[i]);
	for(int i=0;i<n;i++)  	for(int j=0;j<n;j++) {
		if(s[i][j]=='y'){	//找到单词的起点
		for(int dr=-1;dr<=1;dr++) 
				for(int dc=-1;dc<=1;dc++){    //二重循环可用常量数组替代
					if(s[i+dr][j+dc]=='i')   dfs(dr,dc,i,j,0);
                 //dr,dc,代表竖直和水平共8个方向 ,找到搜索方向后进行搜索,      
		}
	}
	for(int i=0;i<n;i++) {
		for(int j=0;j<n;j++){
			if(idx[i][j]) printf("%c",s[i][j]);
			else printf("*");
		}
      //输出答案,记得换行
		printf("\n");
	}
	return 0;
}

搜索函数

void dfs (int dr,int dc,int r,int c,int cnt){
	if(cnt==7) {
		for(int i=1;i<=7;i++) idx[r-dr*i][c-dc*i]=1;
	}
	//搜索终点,如果可成为一个单词,令其路径上的所有字母 idx=1
    
	if( r>=0&&r<n&&c>=0&&c<n &&s[r][c]==key[cnt]) {
		dfs(dr,dc,r+dr,c+dc,cnt+1);
	}
   	//进行下一个字母的检查和搜索
	return;
}

完整压行代码

#include<cstdio>
#include<string>
using namespace std;
char s[105][105];
const string key="yizhong";
int n,idx[105][105]{};	
void dfs (int dr,int dc,int r,int c,int cnt){
	if(cnt==7)	for(int i=1;i<=7;i++)  idx[r-dr*i][c-dc*i]=1;
	if( r>=0&&r<n&&c>=0&&c<n &&s[r][c]==key[cnt])	dfs(dr,dc,r+dr,c+dc,cnt+1);
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<n;i++)	scanf("%s",&s[i]);
	for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(s[i][j]=='y') 
    		for(int dr=-1;dr<=1;dr++) for(int dc=-1;dc<=1;dc++)
			if(s[i+dr][j+dc]=='i') dfs(dr,dc,i,j,0);
	for(int i=0;i<n;i++) for(int j=0;j<n;j++){
			if(idx[i][j]) printf("%c",s[i][j]);
			else printf("*");
		}
		printf("\n");
	return 0;
}

点个赞再走吧qwq

posted @ 2019-10-19 21:22  frozenpang  阅读(229)  评论(0)    收藏  举报
var x = e.pageX, y = e.pageY; $i.css({ "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, "top": y - 20, "left": x, "position": "absolute", "font-weight": "bold", "color": "rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")" }); $("body").append($i); $i.animate({ "top": y - 180, "opacity": 0 }, 1500, function() { $i.remove(); }); }); });
end