NOIP2017 金秋杯系列模拟赛
noip 提高组模拟赛 day1
1.回形遍历
(calc.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子。
【输入】
输入文件名为 calc.in。
一行,包含五个整数:n,m,x,y,z
【输出】
输出文件名为 calc.out。
输出一行,包含两个整数,表示所在格子的横纵坐标
【输入输出样例】
TYVJ.CN
calc.in calc.out
4 5 3 0 5 2 4
【样例解释】
【数据说明】
对于 70%的数据,1<=n,m,z<=1000,0<=x<n,0<=y<m
noip 提高组模拟赛 day1
1.回形遍历
(calc.cpp/c/pas)
时间限制:1s
内存限制:256MB
【问题描述】
给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子。
【输入】
输入文件名为 calc.in。
一行,包含五个整数:n,m,x,y,z
【输出】
输出文件名为 calc.out。
输出一行,包含两个整数,表示所在格子的横纵坐标
【输入输出样例】
TYVJ.CN
calc.in calc.out
4 5 3 0 5 2 4
【样例解释】
【数据说明】
对于 70%的数据,1<=n,m,z<=1000,0<=x<n,0<=y<m
对于 100%的数据,1<=n,m,z<=100000,0<=x<n,0<=y<m
var
i,j,n,m,x,y,z,c,s:longint;
a:array[0..100000,0..100000]of boolean;
begin
fillchar (a,sizeof(a),false);
read(n,m,x,y,z);
for i:=0 to m-1 do
for j:=0 to n-1 do
a[x,y]:=true;
if z=0 then write(c,s)
else
for i:=0 to m-1 do
for j:=0 to n-1 do
begin
if (a[i,j]=false)and ((a[i,j-1]=true) or (a[i-1,j]=true))
then if (a[i-1,j]=true)and (a[i,j-1]=true) then a[i,j]:=false
else begin
a[i,j]:=true;
dec(z);
end;
c:=i;
s:=j;
end;
end.
这篇216代码很水
主要思路是
用布尔二维数组和深搜。true 表走过 false表没走过 通过剪枝让其走环路 false变为true z-1最后输出数组的横纵坐标