NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組初賽
 E 前進薑餅部落

作者 主題: E 前進薑餅部落  (閱讀 1259 次)

v779n

  • 新手
  • *
  • 文章數: 3
    • 檢視個人資料
E 前進薑餅部落
« 於: 十一月 16, 2013, 11:02:29 pm »

這也沒人解?
記錄

yuxin995

  • 新手
  • *
  • 文章數: 3
    • 檢視個人資料
Re: E 前進薑餅部落
« 回覆 #1 於: 十一月 17, 2013, 08:39:27 am »

剛好之前有寫,不過這題 ZJ 上好像沒有,我是自己拿官方測資來 run
這題跟之前一題玉璽算是姊妹題,就模擬跑一下就可以了

代碼: [選擇]
#include<cstdio>
#include<iostream>
using namespace std;
int T, N, M, H, W;
char map[21][21], p[4][21][21] = {0};
bool match ( int i, int j, int k ) {
    int tH = H, tW = W;
    if ( k == 1 || k == 3 ) swap(tH, tW);
    if ( i + tH > N || j + tW > M ) return false;
    for ( int x = 0 ; x < tH ; x++ )
        for ( int y = 0 ; y < tW ; y++ )
            if ( map[i+x][j+y] != p[k][x][y] && p[k][x][y] != '#' )
                return false;
    return true;
}
int main() {
    scanf ( "%d", &T ) ;
    while ( T-- ) {
        int ans = 0;
        scanf ( "%d%d", &N, &M ) ;
        for ( int i = 0 ; i < N ; i++ )
                scanf ( "%s" , map[i] ) ;
        scanf ( "%d%d", &H, &W ) ;
        for ( int i = 0 ; i < H ; i++ )
                scanf ( "%s" , &p[0][i] ) ;
        for ( int i = 0 ; i < H ; i++ )
            for ( int j = 0 ; j < W ; j++ ) {
                p[1][j][H-i-1] = p[0][i][j];
                p[2][i][j] = p[0][H-i-1][W-j-1];
                p[3][W-j-1][i] = p[0][i][j];
            }
        for ( int i = 0 ; i < N ; i++ )
            for ( int j = 0 ; j < M ; j++ )
                for ( int k = 0 ; k < 4 ; k++ ) 
                    if ( match( i, j, k) ) ans++;
        printf( "%d\n", ans ) ;
    }
    return 0;
}
記錄

WYJOIER

  • 新手
  • *
  • 文章數: 7
    • 檢視個人資料
Re: E 前進薑餅部落
« 回覆 #2 於: 四月 23, 2014, 05:13:36 pm »

附上我的解法如下:
代碼: [選擇]
#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
using namespace std;
inline int Readint()
{
char c = getchar();
while( !isdigit(c) )c = getchar();
int Answer = 0;
while( isdigit(c) )
Answer = Answer*10 + (c-'0') , c = getchar();
return Answer;
}
inline char ReadChar()
{
char c = getchar();
while( ( c != '0' && c != '1' ) && c != '#' )c = getchar();
return c;
}
char Map[51][51] , Card1[51][51] , Card2[51][51] , Card3[51][51] , Card4[51][51];
inline int Solve( char Card[51][51] , int N , int M , int H , int W )
{
bool Judge;
int Answer = 0;
for( int i = 0; i < N; i++ )
{
if( i + H > N )break;
for( int j = 0; j < M; j++  )
{
if( j + W > M )break;
Judge = true;
for( int x = i , a = 0; a < H && Judge; x++ , a++ )
for( int y = j , b = 0; b < W && Judge; y++ , b++ )
{
if( Card[a][b] == '#' )continue;
if( Card[a][b] != Map[x][y] )Judge = false;
}
if( Judge )Answer++;
}
}
return Answer;
}
int main()
{
ios::sync_with_stdio(false);
int T , N , M , H , W;
//scanf("%d",&T);
T = Readint();
while( T--/* && scanf("%d%d",&N,&M)*/ )
{
N = Readint() , M = Readint();
//memset( Map , 0 , sizeof(Map) );
//memset( Card1 , 0 , sizeof(Card1) );
//memset( Card2 , 0 , sizeof(Card2) );
//memset( Card3 , 0 , sizeof(Card3) );
//memset( Card4 , 0 , sizeof(Card4) );
for( int i = 0; i < N; i++ )
for( int j = 0; j < M; j++ )
Map[i][j] = ReadChar();//cin >> Map[i][j];//scanf("%c",Map[i][j]);
H = Readint() , W = Readint();
for( int i = 0; i < H; i++ )
for( int j = 0; j < W; j++ )//Card1
Card1[i][j] = ReadChar();//cin >> Card1[i][j];
for( int i = 0 , x = W-1; i < W; i++ , x-- )//Card2
for( int j = 0 , y = 0; j < H; j++ , y++ )
Card2[i][j] = Card1[y][x];
for( int i = 0 , x = H-1; i < H; i++ , x-- )//Card3
for( int j = 0 , y = 0; j < W; j++ , y++ )
Card3[i][j] = Card2[y][x];
for( int i = 0 , x = W-1; i < W; i++ , x-- )//Card4
for( int j = 0 , y = 0; j < H; j++ , y++ )
Card4[i][j] = Card3[y][x];
printf("%d\n",Solve(Card1,N,M,H,W)+Solve(Card2,N,M,W,H)+Solve(Card3,N,M,H,W)+Solve(Card4,N,M,W,H));
}
return 0;
}
記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組初賽
 E 前進薑餅部落