UVA 12337

来源:互联网 发布:演员 知乎 编辑:程序博客网 时间:2024/04/30 04:14

题目链接: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;}