作为一个弱渣,比赛时各种花式wa,今天尝试做了做,发现那时候理解的题意都不对。
题意:把一个'.'换成'x'是否可以由'x'围起来一些字母,而且这些字母全是'o'。(之前以为能围住'o'就行,原来题意是围住的里面也不能有'.')。
题意:枚举每一个'.',使其变成'x',在这一点周围四个点为方向进行DFS,遇到'x'返回,如果存在一个DFS过程中没发现'.'即存在。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #include <cstdlib> #include <map> using namespace std; char str[15][15]; bool visit[15][15]; int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int f; void DFS(int x, int y) { int xx, yy; if(str[x][y]=='.') { f=1; return ; } if(str[x][y]=='x') return ; for(int i=0; i<4; i++) { xx = x+dir[i][0]; yy = y+dir[i][1]; if(xx>=1&&xx<=9&&yy>=1&&yy<=9&&visit[xx][yy]==false) { visit[xx][yy] = true; DFS(xx, yy); } } } int solve() { for(int i=1; i<=9; i++) { for(int j=1; j<=9; j++) { if(str[i][j]=='.') { str[i][j] = 'x'; int xx, yy; for(int k=0; k<4; k++) { xx = i+dir[k][0]; yy = j+dir[k][1]; if(xx>=1&&xx<=9&&yy>=1&&yy<=9&&str[xx][yy]=='o') { memset(visit, false, sizeof(visit)); visit[xx][yy] = true; f = 0; DFS(xx, yy); if(f==0) return 1; } } str[i][j] = '.'; } } } return 0; } int main() { int t; scanf("%d", &t); for(int tt=1; tt<=t; tt++) { for(int i=1; i<=9; i++) { scanf("%s", str[i]+1); } memset(visit, false, sizeof(visit)); int ans = solve(); if(ans) printf("Case #%d: Can kill in one move!!! ", tt); else printf("Case #%d: Can not kill in one move!!! ", tt); } return 0; }