问题标题: 酷町堂:6190 TLE 求优化算法

0
0
张曈
张曈
高级守护
高级守护

先简述思路 录入n,m后预处理每一个点下一个方向点的坐标 再BFS 加入如果当前点匹配少就无法入队的剪枝

CODE:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int n,m;
char a[60][60],s[10001];
int len,b[60][10001];
struct point{
	int x,y;
}next[60][60][4];
struct NODE{
	int x,y,t,step;
};
queue <NODE> q;
void init() {
	len=1;
	while(s[len]!=0){
		len++;
	}
	s[len]='*';
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c=a[i][j];
			for(int k=i+1;k<=n;k++)
				if(a[k][j]!=c){
					next[i][j][0].x=k;
					next[i][j][0].y=j;
					break;
				}
			for(int k=i-1;k>0;k--)
				if(a[k][j]!=c){
					next[i][j][1].x=k;
					next[i][j][1].y=j;
					break;
				}
			for(int k=j+1;k<=m;k++)
				if(a[i][k]!=c){
					next[i][j][2].x=i;
					next[i][j][2].y=k;
					break;
				}
			for(int k=j-1;k>0;k--)
				if(a[i][k]!=c){
					next[i][j][3].x=i;
					next[i][j][3].y=k;
					break;
				}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%s",a[i]+1);
	}
	scanf("%s",s+1);
	init();
	q.push(NODE{1,1,0,0});
	int nx,ny;
	memset(b,0xff,sizeof(b));
	while(!q.empty()){
		NODE h=q.front();
		q.pop();
		if(a[h.x][h.y]==s[h.t+1]){
			if(h.t+1==len){
				printf("%d\n",h.step+1);
				break;
			}
			q.push(NODE{h.x,h.y,h.t+1,h.step+1});
		}
		else {
			for(int i=0;i<4;i++){
				nx=next[h.x][h.y][i].x;
				ny=next[h.x][h.y][i].y;
				if(nx!=0 && ny!=0 && b[nx][ny]<h.t){
					b[nx][ny]=h.t;
					q.push(NODE{nx,ny,h.t,h.step+1});
				}
			}
		}
	}
	return 0;
}

能否在此算法基础上加以优化?

若无法继续优化 能否提供一种新的算法?

张曈在2021-02-18 17:48:13追加了内容

提交结果第1、2、5、7、10五个点TLE,73分 


0
0
汤恩语
汤恩语
初级守护
初级守护

用贪心

你每次选下一个字母需要按几下键可以算出来

0
0
谭迪元
谭迪元
资深光能
资深光能

试试#pragma GCC optimize(3)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

说实话,我也不会......

我要回答