中国石油大学2019-2020大学、中学校、小学校向けトレーニングコンペティションの第2セッションにおけるF質問の位置[スパイラルマトリックス+ DFS]

質問リンクhttp://icpc.upc.edu.cn/problem.php?cid=1961&pid=5

タイトル説明

Chenchenはまだコアアルゴリズムを開発していないため、ゲームでは常に敗北しています。チェンチェンは反撃するために殺人者のメイスを取り出し、数字を使って位置を見つけるという大規模な問題を細心の注意を払って設計しました:N N(Nは奇数)の床タイル、それぞれに数字が書かれており、これらの数字は正確に1ですN平方に。彼女は、N Nの正方形を形成するために、床タイルを中央から地面にらせん状に配置しました以下に示すように、N = 5の場合:

各タイルの位置は、行番号と列番号で示されます。左上の床タイルの位置は最初の行と最初の列であり、右下の床タイルの位置はN番目の行とN番目の列です。上の写真の3番の床タイルは、2行目と3列目にあります。

タイルがX行Y列にある場合、位置コードはX * N + Yです。例:上の図の番号1の住所位置コードは5 * 3 + 3 = 18、番号5の住所位置コードは5 * 3 + 4 = 19です。

Chenchenは、番号Aの位置コードを明確に計算する必要があります。例:N = 5、A = 6、は:24

ここに画像の説明を挿入

各質問の前に、Chenchenは正解を知りたいと思っています。位置コードをプログラムして計算してください。

入る

最初の行:1つの奇数N。
2行目:1つの整数A。(0 <A <= N * N)

出力

番号Aのフロアタイルの位置コードを表す整数。
サンプル入力のコピー
5
20

サンプル出力

28

促す

データ範囲:80%データ0 <N <1000; 100%データ0 <N <100000。

問題分析:

まず、これは階層行列であり、その中に漸化式を見つける必要があります。最初に中央の1を差し引くことができます。入力が1の場合、特別な判断を追加するだけで済みます
。1を最初のレイヤーと見なし、各リングはレイヤーです。

行列がn番目のレイヤーに
ある場合左上隅の値:(2n-3)²+ 1
右上隅の値:(2n-3)²+ n + 2下隅
の値右隅:(2n-3)²+(2 n)+3
左下隅の値:(2n-3)²+(3
n)+4
ここに画像の説明を挿入
画像:qq_35339563
次に、最外層から内部
で、レイヤーに入力した数値を検索し、
次に4つのコーナー検索ます。の値は、行列の各レイヤーを4つの領域
分割して、その位置を決定します。

1番号が探しているレベルを調べます
2番号が4つの領域のどの領域にあるかを調べます
3ランクを決定します

コードを添付してください:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; 
typedef long long ll;                   // a 为行, b为列。  t为要寻找的数字,  n为矩阵的目前规格 
ll t,n,a,b; 
void dfs(ll n,ll t ) {
    
    
	ll q,w,e,r,l,circle, maxn;
	maxn=n*n;                          //  该层的最大值
	l=pow((n-2),2);
	q=l+1;                             //  左上角
	w=l+1*n-1;                        //  右上角
	e=l+2*n-2;                        //   右下角
	r=l+3*n-3;                       //   左下角
	if(n==1) {
    
    
		a=1;
		b=1;
		return;
	}
	if(t>=q&&t<=maxn) {
    
                       //  如果要搜索的数字在这一层中,进入寻找。     如果不在进入下面else
		if(t>=q&&t<=w) {
    
    
			a=1;
			b=t-q+1;
		} else if(t>w&&t<=e) {
    
    
			b=n;
			a=t-(w);
		} else if(t>e&&t<=r) {
    
    
			a=n;
			b=n-(t-e)+1;
		} else {
    
    
			b=1;
			a=n-(t-r)+1;
		}
		return ;
	} else {
    
                            // 要找的数不在上一层循环中,  进入下一层, a++,b++;
		dfs(n-2,t);
		a++;
		b++;
		return ;
	}
}
int main() {
    
    
	scanf("%lld%lld",&n,&t);
	dfs(n,t);
	printf("%lld",a*n+b);
	return 0;
}

おすすめ

転載: blog.csdn.net/wmy0536/article/details/103218596