其他分享
首页 > 其他分享> > 矩阵

矩阵

作者:互联网

小S有个n×m的字符矩阵,里面都是小写字母。

现在小S每一步可以向下或者向右走,从左上角走到右下角。现在他想让他走出的字母拼接起来字典序最小。

输入格式
第一行两个整数n,m。

接下来n行,每行长度为m的字符串,表示该矩阵。

输出格式
一个长度为n+m−1的字符串表示答案。

样例1
input

4 5
ponoc
ohoho
hlepo
mirko 

output

pohlepko 

样例2
input

4 5
bbbbb
bbbbb
bbabb
bbbbb

output

bbbbabbb 

数据范围
40%的数据:对于每个位置,它下面的和它右面的字符不同。

100%的数据:\(1≤n,m≤2000\)
时间限制:1S

空间限制:256MB

考虑40%数据点,如果下面的和右面的不同,那就取最小值。

但是相同呢?开一个队列表示现在那些到了的点都相同的位置,然后都往下往右扩展,找到一个最小值。一个点如果等于那个最小值,那就把他放到下一次扩展的队列里。

#include<cstdio>
#include<iostream>
using namespace std;
const int N=2005;
int qx[2][N],qy[2][N],n,m,t,p,idx,k,mn,v[N][N];
char s[N][N];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%s",s[i]+1);
	qx[0][1]=qy[0][idx=p=1]=1;
	putchar(s[1][1]);
	for(idx=1;;idx++)
	{
		k=0,mn=500;
		for(int i=1;i<=p;i++)
		{
			if(qx[t][i]!=n)
				mn=min(mn,(int)s[qx[t][i]+1][qy[t][i]]);
			if(qy[t][i]!=m)
				mn=min(mn,(int)s[qx[t][i]][qy[t][i]+1]);
		}
		for(int i=1;i<=p;i++)
		{
			if(qx[t][i]!=n&&(int)s[qx[t][i]+1][qy[t][i]]==mn&&v[qx[t][i]+1][qy[t][i]]!=idx)
				qx[!t][++k]=qx[t][i]+1,qy[!t][k]=qy[t][i],v[qx[t][i]+1][qy[t][i]]=idx;
			if(qy[t][i]!=m&&(int)s[qx[t][i]][qy[t][i]+1]==mn&&v[qx[t][i]][qy[t][i]+1]!=idx)
				qx[!t][++k]=qx[t][i],qy[!t][k]=qy[t][i]+1,v[qx[t][i]][qy[t][i]+1]=idx;
		}
		if(k)
			p=k,t^=1;
		else
			break;
		putchar(mn);
	}	
}

标签:40%,int,矩阵,最小值,input,bbbbb
来源: https://www.cnblogs.com/mekoszc/p/16209882.html