Codeforces Round #664 (Div. 2)
A. Boboniu Likes to Color Balls
题意:总共四个颜色,可以进行的操作是,前三个一人拿一个放到第四个,就相当于前三个都减一,第四个+3。然后得到的四个数,每个数对应一种字符的个数,问这些字符是否能构成回文串。
分析:回文串最多就一个不对称的位置就是最中间,最终得到的所以四个数最多只能有一个奇数。
情况:
因为最后一个数要变,前三个数一起不变或者减一。所以统计前三个里面有几个奇数。
①若没有奇数,则无需判断最后一个数,无论奇偶都可以拼成回文串。
②还要考虑若存在前三个数里有0,就是不能操作,则需要判断前三个中奇数的个数,若>1,则肯定不行,进行不了操作,还有多于一个的奇数。若<=1,当成=1,因为为0的情况已经在①中,因为进行不了操作,所以需要判断最后以为的奇偶,已存在一个奇数,所以最后一个必须为偶。
③若没有0存在,个数为1,那就要判断最后一位,不进行操作,因为操作后前三个的奇偶个数颠倒。最后以为需为偶。
④个数为2,则需要进行操作,个数颠倒,前三个里奇数个数为1,w+3,若满足最后只存在一个奇数,则原来的w为奇数。
⑤个数为3,则进行操作,前三个里奇数个数为0,无论最后一个数奇偶都可以组成回文串。
代码
#include <iostream>
#include <stdio.h>
#include <math.h>
#include<cmath>
#include<string.h>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int r,g,b,w,num=0;
scanf("%d%d%d%d",&r,&g,&b,&w);
if(g%2==1)
num++;
if(r%2==1)
num++;
if(b%2==1)
num++;
if(num==0)
printf("Yes\n");
else if(r==0||b==0||g==0)
{
if(num>1)
printf("No\n");
else
{
if(w%2==0)
printf("Yes\n");
else
printf("No\n");
}
}
else if(num==1)
{
if(w%2==0)
printf("Yes\n");
else
printf("No\n");
}
else if(num==2)
{
if(w%2==1)
printf("Yes\n");
else
printf("No\n");
}
else if(num==3)
{
printf("Yes\n");
}
}
return 0;
}
B. Boboniu Plays Chess
题意:给出矩阵大小和起点,像象棋里的车一样移动,用一行随便移动没走过的地方,同列也是,不要求回到起点,全部走完矩阵,输出路径。
思路:n,m范围是100,所以考虑到用dfs,所有可能就是,一个坐标不动,零个坐标遍历从1到n或到m。
代码
#include <iostream>
#include <stdio.h>
#include <math.h>
#include<cmath>
#include<string.h>
#include<cstdlib>
#include<algorithm>
using namespace std;
int vis[105][105],num=0,n,m;
void dfs(int x,int y)
{
printf("%d %d\n",x,y);
vis[x][y]=1;
num++;
if(num==n*m)
return;
for(int i=1;i<=n;i++)
{
if(vis[i][y]==0)
dfs(i,y);
}
for(int j=1;j<=m;j++)
{
if(vis[x][j]==0)
dfs(x,j);
}
}
int main()
{
int sx,sy;
scanf("%d%d%d%d",&n,&m,&sx,&sy);
memset(vis,0,sizeof(vis));
dfs(sx,sy);
return 0;
}