CSP-M1 Cのタイトル

質問の意味:
我々はすべて知っているように、神は、スイスのCS学部天井に達しているが、外側は人剛を超えた人を知りません。広大な宇宙では、剛の生き物と呼ばれる犬がある、生き物は人間の知識生まれの大学院生のレベル、および自然にCSPで良い、と国のも、最初のレベルに達することができるようになります。最も恐ろしいものはあり、それは宇宙線を放出することができる。しかし、宇宙線が人のIQを破壊することができ、ダウン-chiがヒット。宇宙線は無限の二次元平面、デフォルトの初期上方向に(二次元グリッド画像として見ることができる)伝播します。合理不変ながら、宇宙線は、2本の分割宇宙線の方向に対して45度について、分割後のある距離で放出されるであろう。宇宙線がn回分割、往路として各部門は、長さの単位を愛。スイスは今、神は彼の小さな兄弟犬の挑戦剛を持参したいが、ルイ神ルイ神は彼が位置の総数を計算助けるためにあなたに頼んだので、チーが削減されます、彼らのIQは普通の学部レベルのコースようzjmをドロップしたくありません一撃。
入力:
入力Nは、宇宙線は、n番目の分割されます
入力整数をN、A1、A2 ...、宇宙線は、それが方向に分割長い後にユニットをaiを移動し続ける表します。
出力:
出力知的戦闘を削減されますどのように多くのポジション。
INPUTサンプル:
4
4 2 2 3
サンプル出力:
39
:アイデア
ビット迷路のような考え方を持つ前に、この、単に少し。入力Bによる4次元配列は、1またはトラバースは、関数の外に、終了した場合。各部門は、xで実行した後のサイクルの必要な数よりも少ないが、変数xのため、分割を決定するにおいて、Y方向は、Yが更新されます。ポイントが廃止されたとマークされていない通過して、この点をマーキング、カウント数の値も再び再帰的に分割することにより、異なる二方向で決定し、増加しています。
コード:

#include<iostream>
using namespace std;
int disx[]={0,-1,-1,-1,0,1,1,1};
int disy[]={1,1,0,-1,-1,-1,0,1};
int count=0;
int a[400][400];
int n;
int b[400][400][30][8]={0};
int step[30];
void dfs(int dir,int num,int x,int y)
{
    
 if(b[x][y][num][dir]==1||num==n)
 {
  return;
 }
 b[x][y][num][dir]=1;
 for(int i=0;i<step[num];i++)
 {
  x+=disx[dir];
  y+=disy[dir];
  if(!a[x][y])
  {
   a[x][y]=1;
   count++;
  }
 }
 dfs((dir+1)%8,num+1,x,y);
 dfs((dir+7)%8,num+1,x,y);
}
int main()
{
 //int n;
 cin>>n;
 //int a[n];
 for(int i=0;i<n;i++)
 {
  cin>>step[i];
 }
 int dir=0;
 int x=200;
 int y=200;
 int num=0;
 dfs(dir,num,x,y);
 //dfs(200,200,0,0);
 cout<<count;
 return 0;
}
公開された19元の記事 ウォンの賞賛0 ビュー212

おすすめ

転載: blog.csdn.net/weixin_45117273/article/details/104982939