A. 核酸檢測
時間限制:100ms
空間限制:128MB
題目描述
新型冠狀病毒疫情爆發!某城市內大量疑似患者被集中到各個隔離點,初期確診非常
困難,專家團隊需要依次到這些隔離點去現場指導,爲疑似患者進行核酸檢測。城市共有 n(n+1)個隔離點,它們形成了 n行n+1 列的方陣。我們用 (r,c)表示位於從上到下第 r行、從左到右第 c列的隔離點。例如,左上角的座標是 (1,1),
右下角的座標是 (n,n+1)。
該城市的交通結構比較特殊,任意兩個對角方向的相鄰隔離點之間有一條雙向通路。
此外,在方陣的邊界處有一條順時針運行的單向地鐵環線。下圖是一個n=5 的城市
示意圖:
專家可以從任意一個隔離點出發,之後你可以沿着道路或乘坐地鐵前往其他隔離點。走過一條道路、乘坐一段地鐵都需要 單位時間。在隔離點處進行核酸檢測所需的時間忽略不計。
專家迫切想要知道最少需要多少時間才能完成所有隔離點的核酸檢測。請求出最少需要的時間,以及一條路線。
輸入描述:
輸入共一行,包含一個整數n(2<=n<=100) ,表示隔離點方陣的行數。
輸出描述
第一行輸出一個整數,表示花費的時間 T。
接下來包含T+1 行。這部分的第i行包含兩個整數xi,yi ,用一個空格隔開,表示你構造出的路線經過的第 i個隔離點座標是(xi,yi).
如果存在多種可行的方案,請輸出任意一種可行的方案。
樣例輸入
2
樣例輸出
5
1 1
1 2
1 3
2 3
2 2
2 1
這道題我們用深搜會超時,但是深搜告訴我們T一定會等於n(n+1)-1
於是,我便想到一定會有一種方法能在不走重複點的情況下遍歷所有的點。我們可以將這個遍歷看成是在轉圈圈,通過幾個判斷來控制遍歷,如下圖:(注意紅色點需判斷)。
遺憾的是,這方法我在比賽結束後一秒才做出來,至於對不對,請大家在評論區斧正,但我覺得應該沒有問題了
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;
const int MAX=2147483647;
int n,ex=1,ey=1,x=2,y=2,step=1;
int main()
{
//fre();
scanf("%d",&n);
int ans=n*(n+1)-1;
printf("%d\n1 1\n2 2\n",ans);
while(step!=n*(n+1)-1)
{
int tx=x,ty=y;
if(x==1) //第一行
{
if(y==n+1) x++;
else if(y==n||ex!=x) y++;
else x++,y++;
}
else if(y==1) {if(ey!=y&&ex!=x) x--; else x--,y++;} //第一列
else if(x==n) {if(ex!=x) y--; else x--,y++;} //第n行
else if(y==n+1) {if(ey!=y||(x==2&&!(n&1))) x++; else x++,y--;} //第n+1列
else //中間
{
if(ex==x+1&&y!=n) x--,y++;
else if(ex==x-1) x++,y--;
else x++,y++;
}
printf("%d %d\n",x,y);
step++,ex=tx,ey=ty;
}
return 0;
}