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 意見:
張貼留言