题目大致是说要你在一个大图里搜四连块(每个四连块表示一个色子面)的个数,在每个四连块里搜色子的点数,点数只能是1到6之间的数....... #include <iostream> #include <cstring> using namespace std ; const int maxn = 50 + 10 ; char map[maxn][maxn] ; bool visit[maxn][maxn] ; int ans[maxn * maxn] ; int r , c ; int xcount ; int dx[] = { -1 , 1 , 0 , 0 } ;//控制x方向 int dy[] = { 0 , 0 , -1 , 1 } ;//控制y方向 //初始化 void init() { memset( map , 0 , sizeof( map ) ) ; memset( visit , 0 , sizeof( visit ) ) ; memset( ans , 0 , sizeof( ans ) ) ; return ; } //判断还在不在同一个色子面上 bool is_ok( int x , int y ) { if( x < 0 || y < 0 || x >= r || y >= c || visit[x][y] || map[x][y] == '.' ) return false ; return true ; } //判断还是不是同一个色子的同一个点 bool is_dot( int x , int y ) { if( x < 0 || y < 0 || x >= r || y >= c || visit[x][y] || map[x][y] != 'X' ) return false ; return true ; } //分离各个点数 int dot( int x , int y ) { visit[x][y] = true ; for( int i = 0 ; i < 4 ; i++ ) { int nx = x + dx[i] ; int ny = y + dy[i] ; if( is_dot( nx , ny ) ) { dot( nx , ny ) ; } } } int dfs( int x , int y ) { visit[x][y] = true ; for( int i = 0 ; i < 4 ; i++ ) { int nx = x + dx[i] ; int ny = y + dy[i] ; if( is_ok( nx , ny ) ) { if( map[nx][ny] == 'X' ) { xcount++ ; dot( nx , ny ) ; }//如果是一个点数,记录点数的变量加一,并且分离这个点 dfs( nx , ny ) ; } } } int cmp( const void * _a , const void * _b ) { int * a = ( int * ) _a ; int * b = ( int * ) _b ; return * a - * b ; } int main() { int ithrow = 1 ; while( cin >> c >> r ) { if( ! c && ! r ) break ; init() ; for( int i = 0 ; i < r ; i++ ) cin >> map[i] ; int cans = 0 ; for( int i = 0 ; i < r ; i++ ) for( int j = 0 ; j < c ; j++ ) { if( ( map[i][j] == '*' || map[i][j] == 'X' ) && ! visit[i][j] ) { xcount = 0 ; dfs( i , j ) ; if( xcount > 0 && xcount < 7 )//判断点数合不合法,如果不合法,则不需要记录,是个wa点哦 ans[cans++] = xcount ; } } qsort( ans , cans , sizeof( int ) , cmp ) ; cout << "Throw " << ithrow++ << endl ; for( int i = 0 ; i < cans ; i++ ) if( ! i ) cout << ans[i] ; else cout << " " << ans[i] ; cout << endl ; cout << endl ; } return 0 ; }