矩阵
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版]
题目描述
Yemaster在玩一个矩阵,这是一个n*m的矩阵,矩阵内每个位置上有一个整数。 Yemaster可以对这个矩阵做以下操作:
1. 下移:将第一行移动到最后一行的后面
2. 右移:将第一列移动到最后一列的后面
3. 上移:将最后一行移动到第一行的上面
4. 左移:将最后一列移动到第一列的上面
例如:3*3的矩阵 1 2 3
4 5 6
7 8 9
如果做第一个操作: 4 5 6
7 8 9
1 2 3
如果做第二个操作: 2 3 1
5 6 4
8 9 7
如果做第三个操作: 7 8 9
1 2 3
4 5 6
如果做第四个操作: 3 1 2
6 4 5
9 7 8
Yemaster想把某个值(这个值可能出现多次,也可能出现0次)移动到第一行第一列,问最少做几次操作可以做到。如果这个值在这个矩阵中不存在或者移动不到第一行第一列,就输出-1。
输入
输入n m
然后输入 n*m大小的矩阵
然后输入Yemaster要找的值 v
输出
输出最少操作次数或-1
样例输入
4 3 1 3 6 4 2 7 5 6 8 3 0 9 2
样例输出
2
提示
两次操作,向下,向右
1<=n, m<=50
矩阵里的值范围[0, 1000]
Yemaster需要的值范围[0, 1000]
样例2
输入
2 3
5 5 5
5 5 5
1
输出
-1
样例3
输入
4 11
1 2 4 1 7 7 2 7 1 2 3
6 5 1 2 5 6 9 1 8 8 6
5 5 5 2 4 9 1 2 6 2 2
1 2 2 6 1 2 8 8 8 8 8
9
输出
6
分析
将数移到做上面,有两种方法:① 用第一种方法,直到这个数在最下行为止。然后用第一个操作。②用第三个操作,直到这个数在第一行为止。将数字移到第一列也是这两种做法。只要比较这两种做法那个少就行了。
答案【1】
在矩阵中找到要找的数,再进行比较
参考程序
var
a:
array
[
1..51
,
1..51
]
of
longint
;
m,n,x,s,i2,j2,i,j,y,min:
longint
;
begin
min:=maxlongint;
read(m,n);
for
i:=
1
to
m
do
for
j:=
1
to
n
do
read(a[i,j]);
readln(x);
for
i:=
1
to
m
do
for
j:=
1
to
n
do
if
x=a[i,j]
then
begin
s:=
0
;
i2:=m-i+
1
;//操作
if
(i-
1
)<i2
then
s:=s+i-
1
else
s:=s+i2;
j2:=n-j+
1
;
if
(j-
1
)<j2
then
s:=s+j-
1
else
s:=s+j2;
if
s<min
then
min:=s;
y:=y+
1
;
end
;
if
y=
0
then
writeln
(-
1
)
else
writeln
(min);
end
.
参考程序2
此程序其实是对方法一的改进,将比较改写成函数,可以节省时间和代码长度
var
a:array[1..51,1..51] of longint;
m,n,x,s,i,j,y,ans:longint;
function min(a,b:longint):longint;
begin
min:=a;
if a>b then min:=b;
end;
begin
ans:=maxlongint;
read(m,n);
for i:=1 to m do
for j:=1 to n do
read(a[i,j]);
readln(x);
for i:=1 to m do
for j:=1 to n do
if x=a[i,j] then
begin
s:=0;
s:=min(m-i+1,i-1)+min(n-j+1,j-1);
ans:=min(ans,s);
y:=y+1;
end;
if y=0 then writeln(-1)
else writeln(ans);
end.