ZJU1002(Fire Net)
#include < stdio.h>
char map[4][4];
int best,n;
int CanPut(int row, int col)
{
int i;
for (i = row - 1; i >= 0; i--)
{
if (map[i][col] == 'O') return 0;
if (map[i][col] == 'X') break;
}
for (i = col - 1; i >= 0; i--)
{
if (map[row][i] == 'O') return 0;
if (map[row][i] == 'X') break;
}
return 1;
}
void solve(int k,int tot)
{
int x,y;
if(k==n*n)
{
if(tot>best) {
best=tot; return;
}
}
else
{
x=k/n;
y=k%n;
if((map[x][y]=='.') && (CanPut(x,y) ) )
{
map[x][y]='O';
solve(k+1,tot+1);
map[x][y]='.';
}
solve(k+1,tot);
}
}
int main()
{
int i,j;
scanf("%d",&n);
while(n>0)
{
for(i=0;i< n;i++)
for(j=0;j< n;j++)
scanf("%1s",&map[i][j]); /*输入单个字符并且忽略空白*/
best=0;
solve(0,0);
printf("%d\n",best);
n=0; /*预防scanf失败,reset n*/
scanf("%d",&n);
}
return 0;
ZJU1003(Crashing Balloon)
////运用了深度优先 的搜索策略
#include < stdio.h>
int flagA,flagB;
int result ;
void dfs(int m,int n,int kk)
{
int k =kk;
if(m==1 && n==1)
{
flagA=1;
return ;
}
if(n==1) flagB =1;
while( (k < m || k < n) && (k< 100) )
{
k++;
if(m%k ==0)
{
dfs(m/k,n,k);
if(flagA)
return ;
}
if(n%k ==0 )
{
dfs(m,n/k,k);
if(flagA)
return ;
}
}
}
int main()
{
int A,B,t;
while(scanf("%d%d",&A,&B)!=EOF )
{
if(A < B )
{
t=A;
A=B;
B=t;
}
flagA =0;
flagB =0;
dfs(A,B,1);
result =A;
if(flagA ==0 && flagB ==1)
result =B;
printf("%d\n",result);
}
return 0;
}
ZJU1004(Anagrams by Stack)
#include < iostream>
#include < string>
#include < stack>
using namespace std;
string str1,str2;
stack< char> stk1,stk2;
char str[200];
void Search(int x)
{
int i,j,k;
k=0;
for(i=0;i<2*str1.length();i++)
str[i] ='i';
for(i=0;i<=x;i++)
stk1.push(str1[i]);
for(i=str2.length()-1;i>=0;i--)
stk2.push(str2[i]);
i=0;
while(!stk2.empty() &&!stk1.empty() )
{
if(stk1.top() == stk2.top() )
{
stk2.pop();
stk1.pop();
str[i++]='o';
}
else
for(j=x;j< str1.length();j++)
{
stk1.push(str1[j]);
if( stk1.top() == stk2.top() )
{
stk2.pop();
stk1.pop();
str[i++] ='o';
break;
}
}
}
if(stk2.size()==0) ///////////stk2.empty() )
{
for(i=0;i<2*str2.length();i++)
printf("%c ",str[i]) ;
}
}
int main()
{
while(cin>>str1>>str2)
{
if(str1.length() !=str2.length() )
{
printf("%c\n",'[');
printf("%c\n",']');
continue;
}
printf("%c\n",'[');
for(int i=str1.length()-1;i>=0;i--)
Search(i);
printf("%c\n",']');
}
return 0;
}
/////此题要求把一定量的(水) 经由A装到B里
///1。先倒进3升桶3升水;
// 2。将这3升水倒入5升的桶;
// 3。再倒进3升桶3升水;
/// 4。再将这3升水倒入已装有3升水的5升桶里,倒满即可。这时,3升桶里还有1升的水;
// 5。倒掉5升桶的水,将3升桶里的1升水倒入5升桶里;
// 6。再倒时3升桶3升水,将这3升水倒入5升桶里,此时5升桶里装的就是3+1=4升水了。
#include < stdio.h>
int main()
{
int ca,cb,n,x,y;
while( scanf("%d %d %d",&ca,&cb,&n)!=EOF)
{
x=y=0;
while(1)
{
printf("fill A\n");
x=ca;
if(x==n)
{
printf("success\n");
break;
}
while(x>0)
{
if((cb-y)>=x)
{
printf("pour A B\n");
y=y+x;
x=0;
}
else
{
printf("pour A B\n");
x=x-(cb-y);
y=cb;
}
if(x==n)
{
printf("success\n");
break;
}
if(y==n) break;
if(y==cb)
{
printf("empty B\n");
y=0;
}
}
if(x==n) break;
if(y==n)
{
printf("success\n");
break;
}
}
}
return 0;
}
ZJU1006(Do the Untwist)
#include < stdio.h>
#include < string.h>
int main()
{
int Key;
char str[70];
int plaincode[70];
int ciphercode[70];
while(scanf("%d",&Key) )
{
if(Key==0)
break;
scanf("%s",str);
int len=strlen(str);
int i=0;
char temp;
while (i< len)
{
temp=str[i];
if(temp=='_')
{
ciphercode[i]=0;
}
else if(temp=='.')
ciphercode[i]=27;
else
ciphercode[i]=(int)(temp-'a')+1;
i++;
}
i=0;
int mod;
while(i< len)
{
mod=(Key*i)%len;
plaincode[mod]=(ciphercode[i]+i)%28;
i++;
}
for(i=0;i< len;i++)
{
if(plaincode[i]==27)
printf("%c",'.');
else if(plaincode[i]==0)
printf("%c",'_');
else
printf("%c",(char)(plaincode[i]-1+'a') );
}
printf("\n");
}
return 0;
}
ZJU1007(Numerical Summation of a Series)
#include< stdio.h>
int main()
{
double sum,a,k;
for(a=0.000;a<=2.000;a=a+0.001)
{
sum=0;
for(k=1;k< 10000;k++)
{
sum=sum+(1-a)/(k*(k+1)*(k+a)); ///f(x)-f(1)=...=sum((1-x)/(k*(k+1)*(k+x)))
}
sum=sum+(1-a)/(2*10000*10000)+1.0; ///////因为 y(1)=1.0 因此加1
printf("%5.3f %16.12f\n", a, sum );
}
return 0;
}
/////附带其他解法
/*#include < iostream>
using namespace std;
int main()
{
double x=0.000,s=0.0,s1=0.0,i,j;
for(i=1400000;i>10000;i--)
s1+=1.0/(i*i*(i+1));
for(i=0;i<2001;i++)
{
s=s1;
for(j=10000;j>=1;j--)
s+=1.0/((j*(j+1))*(j+x));
s*=(1-x);
printf("%5.3f %16.12f\n",x,1+s);
x+=0.001;
}
return 0;
}
#include< stdio.h>
int main()
{
double sum,a,k;
for(a=0.000;a<=2.000;a=a+0.001)
{
sum=0;
for(k=1;k<10000;k++)
{
sum=sum+(1-a)/(k*(k+1)*(k+a)); ///f(x)-f(1)=...=sum((1-x)/(k*(k+1)*(k+x)))
}
sum=sum+(1-a)/(2*10000*10000)+1.0; ///////因为 y(1)=1.0 因此加1
printf("%5.3f %16.12f\n", a, sum );
}
return 0;
}
#include < cstdio>
int main()
{
double sum, x;
int n, k;
for (n=0; n<=2000; n++)
{
x=n/1000.0;
sum=0.0;
for (k=1; k<=10000; k++) sum+=1.0/(k*(k+1.0)*(k+2.0)*(k+x));
double result=(x-1)*0.75+(2-x)*1.0+(x-1)*(x-2)*sum;
printf("%.3f %.12f\n", x, result);
}
return 0;
}
*/
ZJU1008(Gnome Tetravex)
#include < stdio.h>
int map[26][5];
int a[6][6];
bool flag,flag1;
bool llink[26][26],rlink[26][26],tlink[26][26],blink[26][26];
int i,j,m,n,t,all;
int a1,a2,a3,a4;
int nm[26];
float starting;
void dfs(int x,int y)
{
int ii;
if (y==n+1)
{
printf("Possible\n");
flag=true;
}
else
for (ii=1;ii<=all;ii++)
{
if (x<=1 || llink[ii][a[x-1][y]])
if (y<=1 || tlink[ii][a[x][y-1]])
if (nm[ii]>0)
{
a[x][y]=ii;
nm[ii]--;
if (x==n) dfs(1,y+1);else dfs(x+1,y);
nm[ii]++;
if (flag) break;
}
}
}
int main()
{
t=0;
while ((scanf("%d",&n))!=EOF)
{
if (n==0) return 0;
for (i=1;i<=26;i++) nm[i]=0;
all=0;
for (i=1;i<=n*n;i++)
{
scanf("%d %d %d %d",&a1,&a2,&a3,&a4);
flag1=false;
for (j=1;j<=all;j++)
if (a1==map[j][1] && a2==map[j][2] && a3==map[j][3] && a4==map[j][4])
{
flag1=true;
nm[j]++;
}
if (!flag1) {
all++;map[all][1]=a1;map[all][2]=a2;map[all][3]=a3;map[all][4]=a4;
nm[all]=1;
}
}
for (i=1;i<=all;i++)
for (j=1;j<=all;j++)
{
if (map[i][1]==map[j][3]) tlink[i][j]=true; else tlink[i][j]=false;
if (map[i][2]==map[j][4]) rlink[i][j]=true; else rlink[i][j]=false;
if (map[i][3]==map[j][1]) blink[i][j]=true; else blink[i][j]=false;
if (map[i][4]==map[j][2]) llink[i][j]=true; else llink[i][j]=false;
}
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
flag=false;
t++;
if (t>1) printf("\n");
printf("Game %d: ",t);
dfs (1,1);
if (!flag) printf("Impossible\n");
}
}
ZJU1009(Enigma)
#include< stdio.h>
#define Maxm 26
#define Rotor 3
using namespace std;
class enigma
{
public:
enigma();
int add(int,int);
void initialize();
void compute();
void print();
int n,cases;
private:
int num,rotors[Rotor+1][Maxm+1];
};
enigma::enigma()
{
num=0;
}
void enigma::print()
{
++num;
if (num>1)
printf("\\n");
printf("Enigma %d:\\n",num);
}
int enigma::add(int x,int y)
{
if (x+y>n)
return (x+y)%n;
else if (x+y<1)
return (x+y+((-x-y)/n+1)*n);
else
return x+y;
}
void enigma::initialize()
{
int i,j,x;
for (i=1;i<=Rotor;++i)
{
for (j=1;j<=n;++j)
{
x=getchar();
rotors[i][j]=x-(\'A\'+j-1);
}
getchar();
}
}
void enigma::compute()
{
int i,time=0,x,adr,ans;
x=getchar();
while (x!=\'\\n\')
{
x=x-\'A\'+1;
for (i=1;i<=n;++i)
{
adr=add(i,-time);
ans=add(i,rotors[1][adr]);
adr=add(ans,-time/n);
ans=add(ans,rotors[2][adr]);
adr=add(ans,-time/n/n);
ans=add(ans,rotors[3][adr]);
if (ans==x)
break;
}
putchar(i+\'a\'-1);
x=getchar();
++time;
}
printf("\\n");
}
main()
{
enigma x;
int i;
scanf("%d",&x.n);
getchar();
while (x.n!=0)
{
x.initialize();
scanf("%d",&x.cases);
getchar();
x.print();
for (i=1;i<=x.cases;++i)
x.compute();
scanf("%d",&x.n);
getchar();
}
return 0;
}
ZJU1010(Area)
运用向量的 叉积 判断是否相交 !!然后计算简单多边形的面积
但是下面的程序是 WRONG 的,不明白……
#include < stdio.h>
#include < math.h>
struct Polygon
{
double x ;
double y ;
}Poly[1001];
int num ;
bool check()
{
int i ;
Polygon p1q1 ; // p1- q1 ;
Polygon q2q1 ;
Polygon p2q1 ;
for( i = 0 ;i< num ; i++ )
{
p1q1.x = Poly[i].x - Poly[(i+2)%num].x ;
p1q1.y = Poly[i].y - Poly[(i+2)%num].y ;
q2q1.x = Poly[(i+3)%num].x - Poly[(i+2)%num].x ;
q2q1.y = Poly[(i+3)%num].y - Poly[(i+2)%num].y ;
p2q1.x = Poly[(i+1)%num].x - Poly[(i+2)%num].x ;
p2q1.y = Poly[(i+1)%num].y - Poly[(i+2)%num].y ;
if( (p1q1.x * q2q1.y - p1q1.y * q2q1.x)* (q2q1.x * p2q1.y -
q2q1.y * p2q1.x ) > 0 )
return false ;
}
return true ;
}
double Polygon_Area()
{
int i;
double s = 0.0 ;
for( i = 1 ;i <= num ;i++)
s += Poly[(i-1)].x * Poly[i%num].y - Poly[i%num].x *
Poly[(i-1)].y ;
// s=Poly[0].y*(Poly[num-1].x-Poly[1].x) ;
// for( i = 1 ; i < num ; i ++)
// {
// s += Poly[i].y * (Poly[(i-1)].x - Poly[(i+1)%num].x);
// }
return s / 2.0 ;
}
int main(int argc, char* argv[])
{
int i ;
int now = 0 ;
while(scanf("%d",&num )!=EOF )
{
if( num == 0 )
break;
now ++ ;
for( i = 0 ; i < num ; i ++)
scanf("%lf %lf" ,&Poly[i].x ,&Poly[i].y ) ;
if( num < 3 )
{
printf("Figure %d: Impossible\n",now ) ;
continue;
}
if( !check() )
{
printf("Figure %d: Impossible\n",now ) ;
continue ;
}
double area = Polygon_Area() ;
// if(area < 0 )
// area = -area ;
printf("Figure %d: %.2lf\n", now , fabs(area) ) ;
}
return 0;
}
ZJU1016(Parencodings)
#include
int main()
{
int cases;
scanf("%d",&cases);
int num;
int now=1,i,j;
int inta[21],intb[21];
char str[100];
int b[100]={0}; ///biaoji
int Index;
while(now<=cases)
{
for(i=0;i<100;i++)
b[i]=0;
for(i=0;i<21;i++)
intb[i]=0;
scanf("%d",&num);
for(i=0;i=0;j--)
{
if(str[j]=='('&&b[j]==1)
sum++;
if(str[j]=='('&&b[j]==0)
{
sum++;
intb[bIndex]=sum;
bIndex++;
b[j]=1;
break;
}
}
}
}
for(i=0;i< bIndex-1;i++)
printf("%d ",intb[i]);
printf("%d\n",intb[bIndex-1] );
now++;
}
return 0;
}
ZJU1025(Wooden Sticks)
#include
struct Stick
{
int length;
int weight;
bool flag;
};
bool compare( const Stick& a, const Stick& b);
void QuickSort(Stick a[],int low,int high)
{
int i=low,j=high;
Stick temp=a[low];
while (i < j)
{
while (i < j && (temp.lengtha[i].length || (temp.length==a[i].length &&
temp.weight >= a[i].weight))) i++;
if(i < j )
{
a[j]=a[i];
j--;
}
}
a[i]=temp;
if(lowi)
QuickSort(a,i+1,high);
}
int main()
{
int Tgroups;
scanf("%d", &Tgroups);
Stick wooden[5000];
int k=0;
while (k < Tgroups)
{
int testNum;
scanf("%d", &testNum);
int i;
for( i = 0; i != testNum; ++i)
{
scanf("%d%d", &wooden[i].length, &wooden[i].weight);
wooden[i].flag = true;
}
QuickSort(wooden,0,testNum-1);
int minutes = 0;
for( i = 0; i != testNum; ++i)
if (wooden[i].flag)
{
Stick temp = wooden[i];
for( int j = i + 1; j != testNum; ++j)
if (wooden[j].flag)
if ( compare( temp, wooden[j]) )
{
temp = wooden[j];
wooden[j].flag = false;
}
++minutes;
}
printf("%d\n", minutes);
k++;
}
return 0;
}
bool compare( const Stick& a, const Stick& b)
{
if (a.length <= b.length && a.weight <= b.weight)
return true;
else
return false;
}
ZJU1027(Human Gene Functions)
用状态变量d[i,j]表示第一个串中长度为i和第二个串中长度为j的gene的最优解
然后建立状态转移方程
d[i,j]=max{d[i-1,j-1]+value[str1[ i
],str2[j]],d[i,j-1]+value[space,str2[j]],d[i-1,j]+value[str1[ i ],space]}
#include
#include
using namespace std ;
int score[130][130] ;
int d[101][101] ;
struct seq
{
int n ;
string gene ;
} G[2];
void init()
{
memset(score ,0 ,sizeof(score) ) ;
score['A']['A'] = score['C']['C'] = 5;
score['G']['G'] = score['T']['T'] = 5;
score['A']['C'] = score['C']['A'] = -1 ;
score['A']['G'] = score['G']['A'] = -2 ;
score['A']['T'] = score['T']['A'] = -1 ;
score['A']['-'] = score['-']['A'] = -3 ;
score['C']['G'] = score['G']['C'] = -3 ;
score['C']['T'] = score['T']['C'] = -2 ;
score['C']['-'] = score['-']['C'] = -4 ;
score['G']['T'] = score['T']['G'] = -2 ;
score['G']['-'] = score['-']['G'] = -2 ;
score['T']['-'] = score['-']['T'] = -1 ;
}
int max(int a , int b)
{
if(a>=b)
return a ;
else
return b ;
}
int Max(int a, int b ,int c)
{
return max(max(a,b),c ) ;
}
int main()
{
int cases ;
int i , j ;
scanf("%d",&cases ) ;
init();
while(cases -- )
{
for( i = 0 ; i < 2 ;i++)
{
cin>>G[i].n >>G[i].gene ;
}
memset(d , 0 , sizeof(d) ) ;
for( i = 1 ;i <= G[0].n ;i++)
d[i][0] = score[G[0].gene[i-1]]['-'] + d[i-1][0] ;
for( i = 1 ; i <= G[1].n ; i++ )
d[0][i] = score[G[1].gene[i-1]]['-'] + d[0][i-1] ;
for( i = 1 ;i<= G[0].n;i++)
for( j = 1 ;j<= G[1].n ; j++)
{
int a = d[i-1][j-1] + score[G[0].gene[i-1]][G[1].gene[j-1]] ;
int b = d[i-1][j] + score['-'][G[0].gene[i-1]] ;
int c = d[i][j-1] + score[G[1].gene[j-1]]['-'] ;
d[i][j] = Max(a,b,c) ;
}
printf("%d\n",d[G[0].n][G[1].n] ) ;
}
return 0;
}