1 条题解
-
0
自动搬运
来自洛谷,原作者为

灯芯糕
草,赶紧先找个坑把自己埋了搬运于
2025-08-24 21:20:57,当前版本为作者最后更新于2018-08-01 11:27:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
## 本萌新又来发布题解了
## 这一题,我们用搜索染色
## 在此提供一简易代码:
预处理:
int c[10000][2],d=0;//c[10000][2]用来存 “y”出现的地址 int x[9]={0,1,0,1,-1,0,-1,1,-1};//八个方位 int y[9]={0,0,1,1,0,-1,-1,-1,1};//方便比对 char a[103][103],b,k[9]=" yizhong"; bool s[102][102];//定义染色体,“0”输出“*” ,“1”正常输出搜索函数:
bool f(int i,int j,int m,int n,int next){//i,j为数组位置,m,n是方位 if(next>=8){//next是“yizhong”的第几个字符 s[i][j]=1;//比对完毕,进行染色; return 1;//返回 } if(a[i+m][j+n]==k[next])//如果该位置上的字符与对应字符一致,则继续 if(f(i+m,j+n,m,n,next+1)){ s[i][j]=1;//染色 return 1;//返回上一层 } return 0;//不一致,则结束输入:
int n,i,j,o; cin>>n; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ cin>>b; a[i][j]=b;//输入字符 if(b=='y'){ c[++d][0]=i;//记录“y”的位置 c[d][1]=j;//d为“y”的个数 } } }全方位搜索:
while(d){ i=c[d][0]; j=c[d][1]; for(o=1;o<=8;o++){//全方位递归搜索 if(a[i+x[o]][j+y[o]]=='i') if(f(i+x[o],j+y[o],x[o],y[o],3)) s[i][j]=1; } d--;输出:
for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(s[i][j])//染了色,便正常输出 cout<<a[i][j]; else cout<<"*";//否则输出“*” } cout<<endl; }你们最爱的完整代码:
#include<iostream> using namespace std; int c[10000][2],d=0,x[9]={0,1,0,1,-1,0,-1,1,-1}; int y[9]={0,0,1,1,0,-1,-1,-1,1}; char a[103][103],b,k[9]=" yizhong"; bool s[102][102]; bool f(int i,int j,int m,int n,int next){ if(next>=8){ s[i][j]=1; return 1; } if(a[i+m][j+n]==k[next]) if(f(i+m,j+n,m,n,next+1)){ s[i][j]=1; return 1; } return 0; } int main(){ int n,i,j,o; cin>>n; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ cin>>b; if(b=='y'){ c[++d][0]=i; c[d][1]=j; } a[i][j]=b; } } while(d){ i=c[d][0]; j=c[d][1]; for(o=1;o<=8;o++){ if(a[i+x[o]][j+y[o]]=='i') if(f(i+x[o],j+y[o],x[o],y[o],3)) s[i][j]=1; } d--; } for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(s[i][j])cout<<a[i][j]; else cout<<"*"; } cout<<endl; } return 0; }码字挺不容易,大家点个赞再走吧\0^◇^0/。
- 1
信息
- ID
- 103
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者