题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3759
————————————————————————————————————————
题目描述:
有三种颜色的棋子,摆放棋子的顺序已经给出来了,要求把这些棋子蛇形排列到棋盘上,若排列过后,所有行的棋子种类都一样,就是成功的案例。求这些成功的案例中,棋盘长+宽最小的值是多少。
————————————————————————————————————————
题目思路:
棋子数目给定了,那么棋盘的面积就给定了。根据均值不等式 ,当长宽越接近时,长加宽的值越小。
根据这个原则我们开始枚举长宽,并且检测其是否为成功的案例(注意长宽值要颠倒再做一次检测)。
思路应该不难想。一遍ac了。
————————————————————————————————————————
源代码:
#include <iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
char s[110];
int judge(int m,int n)
{
int i = 0,j = 0,curj = 0,curi = 0,cur = 1;
int cell[52][52];
for(i = 0;i<n;i++)
for(j = 0;j<m;j++)
cell[i][j] = 0;
cell[0][0] = s[0];
for(i = 1;i<strlen(s);i++)
{
if(cur == 1)
{
if(curj == m-1 || cell[curi][curj+1])
{
curi ++;
cur = 2;
}
else
curj ++;
}
else if(cur == 0)
{
if(curi == 0 || cell[curi-1][curj])
{
curj++;
cur = 1;
}
else
curi --;
}
else if(cur == 2)
{
if(curi == n-1 || cell[curi+1][curj])
{
curj--;
cur = 3;
}
else
curi++;
}
else if(cur == 3)
{
if(curj == 0 || cell[curi][curj-1])
{
curi--;
cur = 0;
}
else
curj--;
}
cell[curi][curj] = s[i];
}
for(i = 0;i<m;i++)
{
for(j = 1;j<n;j++)
if(cell[j][i]!=cell[0][i])
return 0;
}
return 1;
}
int main()
{
int t = 0,k = 0;
int i = 0,len = 0,j = 0,ans = 0;
scanf("%d",&t);
for(k = 1;k<=t;k++)
{
scanf("%s",s);
len = strlen(s);
for(i = sqrt(len);i>1;i--)
{
if(len%i == 0)
j = len/i;
else continue;
if(judge(i,j) || judge(j,i))
break;
}
if(i>1)
ans = i+j;
else ans = -1;
printf("Case %d: %d\n",k,ans);
}
return 0;
}