估计得分:70+100+0+0+0
实际得分:0+100+10+20+0
T1 棋盘染色
题目描述:
有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)
输入格式:
输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。输出格式:
输出最少染色次数样例输入:
11100 11000 10000 01111 11111
样例输出:
1
时间限制:
1000
估计得分:70
实际得分:0
失分原因:读入时使用scanf读入,出现异常错误,以后关于字符串的读入在不超时情况下尽量使用cin读入
题解:
代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int dx[10]={0,-1,1,0,0}; const int dy[10]={0,0,0,-1,1}; int a[10][10]; int p[10][10]; bool totans; int colornum; int top=0; char c; void del(int x,int y) { p[x][y]=0; int i,tx,ty; for(i=1;i<=4;i++) {tx=x+dx[i]; ty=y+dy[i]; if(tx<1||ty<1||tx>5||ty>5||!p[tx][ty]) continue; del(tx,ty); } } bool check() { int tag=0,i,j; for(i=1;i<=5;i++) for(j=1;j<=5;j++) p[i][j]=a[i][j]; for(i=1;i<=5;i++) for(j=1;j<=5;j++) {if(p[i][j]) {if(tag==0) {del(i,j); tag=1;} else return false; } } return true; } void dfs(int x,int k,int xx,int yy){ if(k==x) {if(check()) totans=1; return ; } if(totans||xx==6) return ; for (int i=yy;i<=5;i++){ if(a[xx][i]) continue; a[xx][i]=1; if(i==5) dfs(x+1,k,xx+1,1); else dfs(x+1,k,xx,i+1); a[xx][i]=0; } for (int i=xx+1;i<=5;i++){ for (int j=1;j<=5;j++){ if(a[i][j]) continue; a[i][j]=1; if(j==5) dfs(x+1,k,i+1,1); else dfs(x+1,k,i,j+1); a[i][j]=0; } } } int main(){ int n; //scanf("%d",&n); for (int i=1;i<=5;i++){ for (int j=1;j<=5;j++){ cin>>c; a[i][j]=c-'0'; if(a[i][j]==1) top++; } c=getchar(); } for (int i=0;i<=25;i++){ dfs(0,i,1,1); if(totans) { printf("%d\n",i); return 0; } } return 0; }