我是個對電腦科學有興趣的學生,我會貼上我的學習歷程及生活心情,也請大大們多多指教。 :)

2015年6月5日 星期五

[UVa] 10284 - Chessboard in FEN

題目網址: https://goo.gl/G2FyzX

題意:
(from luckycat)


解法:
直接模擬。

TAG: 模擬,

注意:

程式碼:
/**
* Tittle: 10284 - Chessboard in FEN
* Author: Cheng-Shih, Wong
* Date: 2015/06/05
*/
// include files
#include <bits/stdc++.h>
using namespace std;
// definitions
#define FOR(i,a,b) for( int i=(a),_n=(b); i<=_n; ++i )
#define clr(x,v) memset( x, v, sizeof(x) )
// declarations
char buf[100];
char cb[10][10];
bool emp[10][10];
// functions
inline bool isDig( char ch )
{
return ('0'<=ch && ch<='9');
}
void init( void )
{
static char *cp;
int row = 1, col = 1;
clr( cb, '.' );
cp = buf;
while( *cp ) {
if( *cp == '/' ) {
++row;
col = 1;
} else if( isDig(*cp) ) {
col += (*cp)-'0';
} else {
cb[row][col++] = *cp;
}
++cp;
}
}
inline bool valid( int x, int y )
{
return (1<=x && x<=8 && 1<=y && y<=8);
}
void go( int x, int y, int dx, int dy, int k )
{
while( k-- ) {
x += dx; y += dy;
if( !valid(x,y) ) break;
if( cb[x][y]!='.' ) break;
emp[x][y] = false;
}
}
void attack( char chess, int x, int y )
{
switch( chess ) {
case 'p':
go(x,y,1,-1,1);
go(x,y,1,1,1);
break;
case 'P':
go(x,y,-1,-1,1);
go(x,y,-1,1,1);
break;
case 'r': case 'R':
go(x,y,-1,0,10);
go(x,y,0,-1,10);
go(x,y,1,0,10);
go(x,y,0,1,10);
break;
case 'B': case 'b':
go(x,y,-1,-1,10);
go(x,y,-1, 1,10);
go(x,y, 1,-1,10);
go(x,y, 1, 1,10);
break;
case 'Q': case 'q':
go(x,y,-1, 0,10);
go(x,y, 0,-1,10);
go(x,y, 1, 0,10);
go(x,y, 0, 1,10);
go(x,y,-1,-1,10);
go(x,y,-1, 1,10);
go(x,y, 1,-1,10);
go(x,y, 1, 1,10);
break;
case 'K': case 'k':
go(x,y,-1,-1,1);
go(x,y,-1, 0,1);
go(x,y,-1, 1,1);
go(x,y, 0,-1,1);
go(x,y, 0, 1,1);
go(x,y, 1,-1,1);
go(x,y, 1, 0,1);
go(x,y, 1, 1,1);
break;
case 'N': case 'n':
go(x,y,-1,-2,1);
go(x,y,-2,-1,1);
go(x,y,-2, 1,1);
go(x,y,-1, 2,1);
go(x,y, 1,-2,1);
go(x,y, 2,-1,1);
go(x,y, 2, 1,1);
go(x,y, 1, 2,1);
break;
}
}
void solve( void )
{
clr( emp, true );
FOR( i, 1, 8 ) FOR( j, 1, 8 )
if( cb[i][j]!='.' ) emp[i][j] = false;
FOR( i, 1, 8 ) FOR( j, 1, 8 )
if( cb[i][j]!='.' )
attack( cb[i][j], i, j );
int ans = 0;
FOR( i, 1, 8 ) FOR( j, 1, 8 )
if( emp[i][j] ) ++ans;
printf( "%d\n", ans );
}
// main function
int main( void )
{
// input
while( gets(buf) ) {
init();
solve();
}
return 0;
}

沒有留言:

張貼留言

任何意見都樂意傾聽