我只能说的亏没做,要不就挂0了。。
本来想四色定理,肯定4就可以的。。。然后准备爆,发现3的时候不好爆,又想了老一会,嗯,数据范围不小,应该不是暴力,直接找规律,貌似最大就是3,有一个3连块,输出3,其他输出2什么的。交,发现有环的时候,特殊的也是3。。。没办法还得暴力啊。暴力2的情况,写的也是各种错误。。。终于过了。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 char p[51][51]; 9 int o[51][51];10 int mp[2501][2501],pre[2501];11 int a[6] = { 0,0,1,-1,1,-1};12 int b[6] = { 1,-1,0,0,-1,1};13 int num = 1;14 int dfs(int x,int step)15 {16 int i;17 for(i = 1;i < num;i ++)18 {19 if(i == x) continue;20 if(mp[x][i]&&pre[x] == pre[i])21 {22 return 0;23 }24 else if(mp[x][i])25 {26 pre[i] = step%2 + 1;27 if(dfs(i,step+1) == 0)28 return 0;29 }30 }31 return 1;32 }33 class HexagonalBoard34 {35 public :36 int minColors(vector board)37 {38 int i,j,k,n,flag;39 n = board[0].size();40 for(i = 0;i < n;i ++)41 {42 for(j = 0;j < n;j ++)43 {44 if(board[i][j] == 'X')45 o[i][j] = num ++;46 }47 }48 for(i = 0;i < n;i ++)49 {50 for(j = 0;j < n;j ++)51 {52 if(board[i][j] != 'X') continue;53 if(flag == 0) flag = 1;54 for(k = 0;k < 6;k ++)55 {56 if(i + a[k] >= 0&&i + a[k] < n&&j + b[k] >= 0&&j + b[k] < n)57 {58 if(board[i+a[k]][j+b[k]] == 'X')59 {60 flag = 2;61 mp[o[i][j]][o[i+a[k]][j+b[k]]] = 1;62 }63 }64 }65 }66 }67 if(flag == 2)68 {69 for(i = 1;i < num;i ++)70 {71 if(!pre[i])72 {73 pre[i] = 2;74 if(dfs(i,0) == 0)75 return 3;76 }77 }78 return 2;79 }80 else if(flag == 1)81 return 1;82 else83 return 0;84 }85 };