思路
从 2 ~ s*s 一直遍历, 此时 当前值 比 前一个值 大1 ,满足一个条件,再通过元素下标判断其位置是否相连:
相连, 更新 步数, 最大步数,胜者房间
不相连,以当前房间为起点,重新记录步数
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1007;
int g[N*N][2];//记录下标
int val, maxCnt;//最大值
int cnt, tval;//当前值
int T, s;
int main()
{
cin >> T;
for(int t = 1; t <= T; t++)
{
//初始:最初胜者为1号房间,步数为1
tval = 1, val = 1, maxCnt = 1, cnt = 1;
cin >> s;
int tmp;
for(int i = 1; i <= s; i++)
for(int j = 1; j <= s; j++)
cin >> tmp, g[tmp][0] = i, g[tmp][1] = j;//记录下标
for(int i = 2; i <= s * s; i++)
{
if(abs(g[i][0] - g[i - 1][0]) + abs(g[i][1] - g[i - 1][1]) == 1)//连续的数 且 位置相连
{
cnt++;
if(cnt > maxCnt)//更新
{
maxCnt = cnt;
val = tval;
}
}
else//连续的数 但 位置不相连
{
cnt = 1;//更新临时房间的步数
tval = i;//以断点房间为起点
}
}
cout << "Case #" << t << ": " << val << ' ' << maxCnt << endl;
}
return 0;
}