2017年3月13日 星期一

Y7M3 P2A練習4

100北二區資訊複賽

1.圈叉連線數問題(zj:a817)      ✔(上次已傳)

2.藏寶問題(zj:a824)                ✔(上次已傳)

3.小四數學(zj:a825)                ✔(上次已傳)

4.天氣預測問題(zj:a826)         

5.俄羅斯方塊問題(zj:a827)

101北二區資訊複賽

1.解碼問題(zj:a818)                  ✔(上次已傳)

2.小三資優數學(zj:a819)

3.小精靈吃數字(zj:a820)          

4.王者之路(zj:a821)

5.滾球遊戲(zj:a822)

100年4.天氣預測問題(zj:a826)  ================ 
// a826. 4.天氣預測問題 -- 100學年度桃竹苗區資訊學科能力競賽
#include <iostream>
#include <iomanip>
using namespace std;
string stbl[]={"cool" , "mild", "hot", "dry" , "normal" , "high" };
struct rst {
int m;
int v;
int y;
}  rule[5];
int stov(int m, string s)
{
for(int i=0;i<3;++i)
{
if( s==stbl[m*3+i] ) return i;
   }
}
int g[2] ;
int chk(int n)
{
   for(int i=0; i<n; ++i)
   {
      if( g[ rule[i].m ] == rule[i].v ) return (i+1);
   }
   return 0;   
}
int main( )
{

   int ges[10][3] = { {1,0,1} ,  {1,1,1} , {1,0,1} , {2,2,0} , {2,2,0} ,
    {2,2,0} , {2,2,0} , {2,0,0} , {2,1,0} , {0,0,1} };
int t ,h, n  ,m ,i , j , k;
char c , y;
string s;
cin >> n;
for(i=0; i<n; ++i)
{  
cin >> c >> s >>y;
rule[i].m = (c=='H');
rule[i].v = stov(rule[i].m , s );
rule[i].y = (y=='Y');
}
   int  cnt=0;
for(j=0; j<10; ++j)
{  
      g[0] = ges[j][0];
      g[1] = ges[j][1];
      i = chk(n);
 //     cout << g[0] <<" " << g[1]  <<" "<< i  <<":" << rule[i-1].y <<" " <<ges[j][2] <<endl;
      if( i )  cnt += ( rule[i-1].y == ges[j][2] );
      else cnt += ( !ges[j][2] );
}
   cin >> t >> h;
   g[0] = (t>=20) + (t>=28);
   g[1] = (h>=30) + (h>=60);
   i = chk(n);
   cout << cnt << endl;
   cout << i << endl;
   if(i) cout << ( rule[i-1].y ? 'Y' : 'N' ) << endl;
   else cout << "N" << endl;
   
   return 0;
}

/*  ----範例輸入
(之一)
2
H dry Y
T hot N
30 50
(之二)
2
T mild Y
T hot N
25 30
-----------範例輸出
(之一)
8
2
N
(之二)

9
1
Y

*/


101年3.小精靈吃數字(zj:a820) 解1 (x,y)在線上================ 
// zj: a820 小精靈吃數字  -- 101學年度桃竹苗區資訊學科能力競賽
#include <iostream>
using namespace std;
const int maxn=10;
int a[maxn][maxn];
int dx[4]={-1, 1, 1,-1};
int dy[4]={ 1, 1,-1,-1};
int nd[4][2][2] = { {0,3,1,2}, {1,2,0,3}, {2,1,3,0}, {3,0,2,1} };  //新轉向表
int main( )
{
   int w,h,i,j,k ;
  int x,y,d,d2 ,nx,ny;
  while( cin >> w >> h )
  {
 for(i=0; i<h; ++i)
  for(j=0; j<w; ++j)
     cin >> a[j][i];
 cin >> x >> y >> d;
 --d;  // 改為 0~3,並x,y改為0,0為左上
 if(dx[d]>0) --x;   if(dy[d]>0) --y;
 int ans=0 ;
 for(int cnt=0; cnt<=3; ++cnt)
 {
    while( 1 )
    {
       nx=x+dx[d];  ny=y+dy[d];
       d2 = nd[d][ d%3?nx>w:nx<0 ] [ d>1?ny<0:ny>h ];
/*
switch(d)  // 新的方向
{
case 0: d2=nd[d][nx<0][ny>h];
break;
case 1: d2=nd[d][nx>w][ny>h];
break;
case 2: d2=nd[d][nx>w][ny<0];
break;
case 3: d2=nd[d][nx<0][ny<0];
break;
}
*/
       if( d==d2) { // 方向不變
          ans += a[(x+nx)/2][(y+ny)/2];
          x=nx; y=ny;
       } else {
       d=d2;  break;  // 出界
       }
    }
 }
 cout << ans << endl;  
  }
  return 0;
}

101年3.小精靈吃數字(zj:a820) 解2 (x,y)在格子內================ 
// zj: a820 小精靈吃數字  -- 101學年度桃竹苗區資訊學科能力競賽

/*
第一列 X格,Y列(沒明確說明,假設10x10),第二列至第(Y+1)列皆有(X)個數{且-9<=*<=9},第(Y+2)列為起點(SX,SY)及方向1右上2左上3左下4右下
反彈三次後,即第4次不反彈離開,問經過的數值和
*/
#include <iostream>
using namespace std;
const int MaxN = 10;
int d, r;  //d行進方向, r反彈類型
int dx[]={-1, 1, 1,-1};  //0從右上往左下、1左上、2左下、3右下
int dy[]={1 , 1,-1,-1};  // (dx,dy) 行進的位移
int rx[]={ 0,0,-1,1  ,0};  //0上、1下、2左、3右    、4四角
int ry[]={-1,1, 0,0  ,0};  //四邊反彈後(x,y)+(rx,ry)的位移{非四角}
int a[MaxN+1][MaxN+1];
int main(void)
{
int i,j, x,y,nx,ny;
   int EX,EY;
while( cin >> EX >> EY )
{
for(i=1; i<=EY; ++i)
 for(j=1; j<=EX; ++j)
   cin >> a[i][j];
// 接著讀進入點及方向
cin >> x >> y >> d;
// cout << "由"<<x<<','<<y<<':'<<d<<"進入\n";
d-- ; //改為 0~3  
nx = x; ny=y;
int t=0; //反彈次數
int sum=0; // 數字和
while( t<4 )
{
x=nx;  y=ny; // x,y原座標,
sum += a[y][x];
// cout <<'('<<x<<','<<y<<'='<<a[y][x]<<endl;
nx = x+dx[d];  ny=y+dy[d];
bool xx=(nx<1 || nx>EX) ; //左右 x座標出界
bool yy=(ny<1 || ny>EY) ; //上下 y座標出界
if( xx || yy ) // 有出界,會反彈
{
if ( xx && yy ) { r=4;  d = (d+2)%4; } //四角的反彈
else  // 四邊反彈
{
if(xx && (d==2 || d==3) )   {r=0; d=5-d; }  // 2,3互換
else if(xx && (d==0 || d==1) ) {r=1; d=1-d; }  // 0,1互換
else if(yy && (d==0 || d==3) ) {r=2; d=3-d; }  // 0,3互換
else if(yy && (d==1 || d==2) ) {r=3; d=3-d; }  // 1,2互換
else ; //???
}
// 算出 邊反彈後的新座標
nx = x+rx[r] ;  ny = y+ry[r];
t++;  //反彈加1
}
//else  nx,ny 在界內繼續走
}
cout << sum << endl;

}

return 0;
}

/* ----範例輸入
3 3
1 3 9
-4 -6 5
8 2 -7
3 1 1
3 4
2 5 8
3 -1 -6
7 8 -9
2 0 3
1 1 2
-------範例輸出
44
10
*/

0 意見:

張貼留言