#include <cstdio>
#include <cstring>
int g[30],vist[30],f[1010][30],k,n;
char name[30][100];
void ff()
{
memset(vist,true,sizeof(vist));
bool fff=true;
bool pj=false;
while (fff)
{
memset(g,0,sizeof(g));
for (int i=1;i<=k;i++)
for (int j=1;j<=n;j++)
{
int w=f[i][j];
if (vist[w])
{
g[w]++;
break;
}
}
for (int i=1;i<=n;i++)
if (g[i]>k/2)
{
fff=false;
pj=true;
puts(name[i]);
break;
}
if (!fff) break;
fff=false;
int first=0;
int p;
int j;
for (int i=1;i<=n;i++)
if (vist[i])
{
j=i;
first++;
p=g[i];
break;
}
for (int i=j+1;i<=n;i++)
if (vist[i])
{
first++;
if (p!=g[i])
{
fff=true;
break;
}
}
if (!fff || first==1) break;
int min=0x3fffffff;
for (int i=1;i<=n;i++)
if (min>g[i] && vist[i] )
min=g[i];
for (int i=1;i<=n;i++)
if (min==g[i] && vist[i])
vist[i]=false;
}
if (!pj)
for (int i=1;i<=n;i++)
if (vist[i]) puts(name[i]);
return;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
getchar();
for (int i=1;i<=n;i++)
gets(name[i]);
k=1;
char s[100];
while (gets(s)!=NULL && s[0]!='\0')
{
int j=1;
int l;
l=strlen(s);
for (int i=0;i<l;i++)
if (s[i]!=' ')
{
int q=0;
while (s[i]!=' ' && s[i]!='\0')
q=q*10+s[i++]-'0';
f[k][j++]=q;
}
k++;
}
k--;
ff();
if (T) printf("\n");
}
return 0;
}
第五题:Graphical Editor
画图工具吧...自己算...只有F难弄一点...也是蛋疼。
#include <cstdio>
#include <cstring>
int x,x1,x2,y,y1,y2,n,m;
char k;
char p[300][300];
void fc()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
p[i][j]='O';
}
void fl(int x,int y,char c)
{
p[y][x]=c;
}
void fv(int x,int y1,int y2,char c)
{
if (y1>y2)
{
int t=y1;
y1=y2;
y2=t;
}
for (int i=y1;i<=y2;i++)
p[i][x]=c;
}
void fh(int x1,int x2,int y,char c)
{
if (x1>x2)
{
int t=x1;
x1=x2;
x2=t;
}
for (int i=x1;i<=x2;i++)
p[y][i]=c;
}
void fk(int x1,int x2,int y1,int y2,char c)
{
for (int i=y1;i<=y2;i++)
for (int j=x1;j<=x2;j++)
p[i][j]=c;
}
void ff(int x,int y,char c,char c1)
{
if (p[y][x]==c || p[y][x]!=c1)
return;
p[y][x]=c;
ff(x-1,y,c,c1);
ff(x+1,y,c,c1);
ff(x,y-1,c,c1);
ff(x,y+1,c,c1);
}
void fs()
{
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
printf("%c",p[i][j]);
printf("\n");
}
}
int main()
{
char c;
while (~scanf("%s",&c)&& c!='X')
{
if (c=='I')
{
scanf("%d%d",&m,&n);
fc();
}
else
if (c=='C')
fc();
else
if (c=='L')
{
scanf("%d %d %c",&x,&y,&k);
fl(x,y,k);
}
else if (c=='V')
{
scanf("%d %d %d %c",&x,&y1,&y2,&k);
fv(x,y1,y2,k);
}
else if (c=='H')
{
scanf("%d %d %d %c",&x1,&x2,&y,&k);
fh(x1,x2,y,k);
}
else if(c=='K')
{
scanf("%d %d %d %d %c",&x1,&x2,&y1,&y2,&k);
fk(x1,x2,y1,y2,k);
}
else if (c=='F')
{
char k1;
scanf("%d %d %c",&x,&y,&k);
k1=p[y][x];
ff(x,y,k,k1);
}
else if (c=='S')
{
char ss[1000];
scanf("%s",&ss);
puts(ss);
fs();
}
else
{
char ss[1000];
gets(ss);
continue;
}
}
return 0;
}
第六题:Interpreter
其实就是计算机内存和寄存器的关系,至于题目挺容易的,就是数据输入的时候有点纠结,学到了新的东西sscanf,
#include <cstdio>
#include <cstring>
int f[11];
int m[1010];
char s[100];
int main()
{
int t,a,b,c;
scanf("%d",&t);
getchar();
for(int l=1;l<=t;l++)
{
int i=0;
if (l==1) getchar();
memset(m,0,sizeof(m));
while (fgets(s,sizeof(s),stdin))
{
if (s[0]=='\n') break;
sscanf(s,"%d",&m[i++]);
}
memset(f,0,sizeof(f));
i=0;
int k=0;
bool end=true;
while (end)
{
i++;
a=m[k]/100;
b=m[k]/10%10;
c=m[k]%10;
switch(a)
{
case 1:
if (m[k]==100)
end=false;
break;
case 2:
f[b]=c;
k++;
break;
case 3:
{
f[b]+=c;
f[b]%=1000;
k++;
break;}
case 4:
{
f[b]*=c;
f[b]%=1000;
k++;
break;}
case 5:
{
f[b]=f[c];
k++;
break;}
case 6:
{
f[b]+=f[c];
f[b]%=1000;
k++;
break;}
case 7:
{
f[b]*=f[c];
f[b]%=1000;
k++;
break;}
case 8:
{
f[b]=m[f[c]];
k++;
break;}
case 9:
{
m[f[c]]=f[b];
k++;
break;}
case 0:
{
if (f[c]!=0) k=f[b];
else k++;
break;}
}
}
if (l!=1)
printf("\n");
printf("%d\n",i);
}
return 0;
}
第七题:Check The Check
这个题我非常蛋疼了,挺容易的一个模拟题,死活AC不了...原因我至今没找出来,还是贴出我的错误代码吧,哪位找出来错误提出来下,谢了,估计我的代码就只有我自己能看懂....ORZ
#include <cstdio>
#include <cstring>
#include <cmath>
char map[20][20];
int xb=0,yb=0,xw=0,yw=0,xbb,ybb,yww,xww;
int fp(int x,int y,int t)
{
if (t==-1)
{
if ((map[x+t][y-1]=='k' || map[x+t][y+1]=='k'))
return 1;
}
else
{
if ((map[x+t][y-1]=='K' || map[x+t][y+1]=='K'))
return 1;
}
return 0;
}
int fr(int x,int y,int t)
{
if (t==-1)
{
if (x>xb)
{
x=x+xb;
xb=x-xb;
x=x-xb;
}
if (y>yb)
{
y=y+yb;
yb=y-yb;
y=y-yb;
}
if (x==xb)
{
for (int i=y+1;i<yb;i++)
if (map[x][i]!='.') return 0;
return 1;
}
else
if (y==yb)
{
for (int i=x+1;i<xb;i++)
if (map[i][y]!='.') return 0;
return 1;
}
else return 0;
}
else
{
if (x>xw)
{
x=x+xw;
xw=x-xw;
x=x-xw;
}
if (y>yw)
{
y=y+yw;
yw=y-yw;
y=y-yw;
}
if (x==xw)
{
for (int i=y+1;i<yw;i++)
if (map[x][i]!='.') return 0;
return 1;
}
else
if (y==yw)
{
for (int i=x+1;i<xw;i++)
if (map[i][y]!='.') return 0;
return 1;
}
else return 0;
}
return 0;
}
int fb(int x,int y,int t)
{
if (t==-1)
{
if (fabs(xb-x)!=fabs(yb-y)) return 0;
else
{
if (x>xb)
{
x=x+xb;
xb=x-xb;
x=x-xb;
}
if (y>yb)
{
y=y+yb;
yb=y-yb;
y=y-yb;
}
int k=yb-y;
for (int i=1;i<k;i++)
if (map[x+i][y+i]!='.') return 0;
return 1;
}
}
else
{
if (fabs(xw-x)!=fabs(yw-y)) return 0;
else
{
if (x>xw)
{
x=x+xw;
xw=x-xw;
x=x-xw;
}
if (y>yw)
{
y=y+yw;
yw=y-yw;
y=y-yw;
}
int k=yw-y;
for (int i=1;i<k;i++)
if (map[x+i][y+i]!='.') return 0;
return 1;
}
}
}
int fn(int x,int y,int t)
{
if (t==-1)
{
return (fabs(x - xb) == 2 && fabs(y - yb) == 1) ||
(fabs(x - xb) == 1 && fabs(y - yb) == 2);
}
else
{
return (fabs(x - xw) == 2 && fabs(y - yw) == 1) ||
(fabs(x - xw) == 1 && fabs(y - yw) == 2);
}
return 0;
}
int main()
{
int c=1;
while (1)
{
memset(map,0,sizeof(map));
int kb=0,kw=0;
xbb=0;ybb=0;xww=0;yww=0; // kb是黑棋 kw是白棋
for (int i=1;i<=8;i++)
{
for (int j=1;j<=8;j++)
{
scanf("%c",&map[i][j]);
if (map[i][j]=='k')
{xbb=i;ybb=j;}
if (map[i][j]=='K')
{xww=i;yww=j;}
}
getchar();
}
for (int i=1;i<=8;i++)
{
for (int j=1;j<=8;j++)
{
xb=xbb;xw=xww;yb=ybb;yw=yww;
if (map[i][j]=='P')
kb=fp(i,j,-1);
if (map[i][j]=='p')
kw=fp(i,j,1);
if (map[i][j]=='R')
kb=fr(i,j,-1);
if (map[i][j]=='r')
kw=fr(i,j,1);
if (map[i][j]=='B')
kb=fb(i,j,-1);
if (map[i][j]=='b')
kw=fb(i,j,1);
if (map[i][j]=='Q')
{
kb=fr(i,j,-1);
xb=xbb;xw=xww;yb=ybb;yw=yww;
kb+=fb(i,j,-1);
}
if (map[i][j]=='q')
{
kw=fr(i,j,1);
xb=xbb;xw=xww;yb=ybb;yw=yww;
kw+=fb(i,j,1);
}
if (map[i][j]=='N')
kb=fn(i,j,-1);
if (map[i][j]=='n')
kw=fn(i,j,1);
if (kb || kw) break;
}
if (kb || kw) break;
}
if (xb+yb+xw+yw==0) break;
if (kw) printf("Game #%d: white king is in check.\n",c++);
if (kb) printf("Game #%d: black king is in check.\n",c++);
if (!(kb+kw)) printf("Game #%d: no king is in check.\n",c++);
getchar();
}
return 0;
}
第八题:Australian Voting
澳大利亚投票,好吧,我又看错题目了,蛋疼,其实只要知道题意,想想就知道怎么做了....