1174:Identically Colored Panels Connection
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1174&lang=jp
パネルの変え方は全部で6^5通りなので全部試せる。
#include<iostream> #include<string> #include<vector> #include<algorithm> #define rep(i,n) for(int i=0;i<n;i++) using namespace std; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int h,w,c,grid[8][8]; bool vis[8][8]; int Count(int x,int y, int col){ int cnt=1; vis[y][x]=true; rep(i,4){ int nx=x+dx[i],ny=y+dy[i]; if(0<=nx && 0<=ny && nx<w && ny<h && grid[ny][nx]==col && !vis[ny][nx])cnt+=Count(nx,ny,col); } return cnt; } void rec(int x,int y, int col){ int tmp=grid[y][x],cnt=1; grid[y][x]=col; rep(i,4){ int nx=x+dx[i],ny=y+dy[i]; if(0<=nx && 0<=ny && nx<w && ny<h && grid[ny][nx]==tmp)rec(nx,ny,col); } } int solve(int n){ int ans=0; if(n==5){ if(grid[0][0]!=c)rec(0,0,c); fill(vis[0],vis[8],false); return Count(0,0,c); } int tmp[8][8]; rep(i,8)rep(j,8)tmp[i][j]=grid[i][j]; for(int i=1;i<7;i++){ if(grid[0][0]!=i)rec(0,0,i); ans=max(ans,solve(n+1)); rep(j,8)rep(k,8)grid[j][k]=tmp[j][k]; } return ans; } int main(void){ while(cin >> h >> w >> c,h|w|c){ fill(grid[0],grid[8],0); rep(i,h)rep(j,w)cin >> grid[i][j]; cout << solve(1) << endl; } return 0; }