今天一共做了几道题,做的搜索题 有 棋盘问题,农民追牛问题,还有寻找0和1数字的十进制数字表示n的倍数的问题 。
棋盘问题是给出给定的棋盘大小,还有可以摆放棋子的位置,寻找出多少种摆放的方案,这里有个前提是棋子不能摆在同一行或者同一列。棋盘问题、
农民追牛问题,农民追上牛的最少的步数,农民追牛的方式有向前或向后走一步,或者一下到达2*x 这个位置。农民追牛
0和1表示问题,找到一个十进制的数,只有0和1,是n的倍数,这个题主要是发现搜索的方式,从1开始一直 x*10和 x*10+1,一直找到问题的解。0和1
这三道题以前也都是做过的。
还有下午的练习题,
1.旋转方向问题,有四个方向,给出两个方向,再给出旋转的次数,输出是顺时针旋转的,还是逆时针旋转的。cw顺时针,ccw逆时针 。
用1,2,3,4表示方向,在准备把8个临近的a,b两个点都依次写出来时候,也都发现了规律,将临近的点 划分为两大类,分别是a>b和a<b两类;;还有顺时针逆时针两个都可以的不成立的,发现只要是两个方向不是相邻,肯定是endefinde,所以该开始的限制条件写了两个(方向对角,旋转次数是2的倍数) 只是没有想到限制条件只有旋转次数是2的倍数。
2.守卫问题,看看守卫够不够用。给出一段字母序列,找出每个字母的长度,(记下 这个 字母序列收尾),然后找出整体序列每个点 的每个字母的公共 的个数。
感觉这个题最主要的是找思路,发现自己的思维有点局限,发现思路后代码很好实现。
重点的看看 下午的练习:
旋转方向问题:
Examples
input
^ >
1
output
cw
input
< ^
3
output
ccw
input
^ v
6
output
undefined
Code:
#if 0
#include<bits/stdc++.h>
using namespace std;
int main()
{
char c,cr;
int a,b,k;
cin>>c>>cr>>k;
if(c=='^')
a=1;
else
if(c=='>')
a=2;
else
if(c=='v')
a=3;
else
if(c=='<')
a=4;
if(cr=='^')
b=1;
else
if(cr=='>')
b=2;
else
if(cr=='v')
b=3;
else
if(cr=='<')
b=4;
if(k%2==0)
cout<<"undefined"<<endl;
else
if((a==1&&b==2)||(a==2&&b==3)||(a==3&&b==4)||(a==4&&b==1))
{
if(k%4==1)
cout<<"cw"<<endl;
else
if(k%4==3)
cout<<"ccw"<<endl;
}
else
if((a==2&&b==1)||(a==3&&b==2)||(a==4&&b==3)||(a==1&&b==4))
{
if(k%4==1)
cout<<"ccw"<<endl;
else
if(k%4==3)
cout<<"cw"<<endl;
}
}
#endif
5 1 AABBB
NO
5 1 ABABB
YES
#if 0
#include<bits/stdc++.h>
using namespace std;
int ans;
int main()
{
int t[30][2],n,gar,num=0,max=0;
char c[1000006] ;
cin>>n>>gar;
for(int i=0; i<n; i++)
cin>>c[i];
while(num!=n)
{
int k1,k2;
char cc;
for(int i=0; i<n; i++)
{
if(c[i]!='0')
{
cc=c[i];
k1=i;
t[ans++][0]=i;
break;
}
}
for(int i=n-1; i>=0; i--)
{
if(c[i]==cc)
{
k2=i;
t[ans-1][1]=i;
break;
}
}
for(int i=k1; i<=k2; i++)
{
if(c[i]==cc)
{
num++;
c[i]='0';
}
}
}
for(int i=0; i<n; i++)
{
int cnt=0;
for(int j=0; j<ans; j++)
{
if(t[j][0]<=i && t[j][1]>=i)
{
cnt++;
}
}
if(cnt>max)
max=cnt;
}
if(max>gar)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
#endif