文章目录
古老的密码(uva1339)
#include <bits/stdc++.h>
#define LOCAL
using namespace std;
int main()
{
char s1[110];
char s2[110];
int c1[150],c2[150];
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(cin >> s1 >> s2)
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
int len = strlen(s1);
for(int i = 0; i < len; i++)
{
c1[s1[i]]++;
c2[s2[i]]++;
}
sort(c1,c1+150);
sort(c2,c2+150);
int ok = 1;
for(int i = 0; i < 150; ++i)
if(c1[i] != c2[i])
{
ok = 0;
break;
}
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
刽子手游戏(uva489)
题目有句Each unique wrong guess only counts against the contestant once. 每个错误只会带来一次影响,但实际提交并不需要考虑,虽然考虑也能ac,而且之前正确的答案反复出现没有这个限制,都会算作一次错误
考虑该情况的代码
#include <bits/stdc++.h>
#define LOCAL
//注意每个字符错误只能记一次,但曾经正确的答案反复猜也是错
using namespace std;
const int maxn = 100;
int main()
{
int rd;
char s[maxn],g[maxn];
int flag[150];
int w[150];
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(scanf("%d",&rd) && rd != -1)
{
scanf("%s%s",s,g);
int len1 = strlen(s);
int len2 = strlen(g);
memset(flag,0,sizeof(flag));
memset(w,0,sizeof(w));
int c = 0;
for(int i = 0; i < len1; i++)
{
if(!flag[s[i]])
{
c++;
flag[s[i]] = 1;
}
}
int wrong = 0;
for(int i = 0; i < len2; i++)
{
if(flag[g[i]] == 1)
{
c--;
flag[g[i]] = 2;
}
else if(!w[g[i]])
{
wrong++;
if(flag[g[i]] != 2)
w[g[i]] = 1;
}
if(c == 0 || wrong == 7)
break;
}
printf("Round %d\n",rd);
if(wrong == 7)
printf("You lose.\n");
else if(c == 0)
printf("You win.\n");
else
printf("You chickened out.\n");
}
return 0;
}
书里原来的代码不需要考虑该情况也能ac
#include <bits/stdc++.h>
#define LOCA
const int maxn = 100;
using namespace std;
char s[maxn],s2[maxn];
int le = 0,chance = 0;
int win,lose;
void guess(char ch)
{
int bad = 1;
for(int i = 0; i < strlen(s); ++i)
if(s[i] == ch)
{
bad = 0;
s[i] = ' ';
le--;
}
if(bad)
chance--;
if(!le)
win = 1;
else if(!chance)
lose = 1;
}
int main()
{
int rd;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(scanf("%d",&rd) && rd != -1)
{
scanf("%s%s",s,s2);
printf("Round %d\n",rd);
win = lose = 0;
le = strlen(s);
chance = 7;
int len = strlen(s2);
for(int i = 0; i < len; ++i)
{
guess(s2[i]);
if(win || lose)
break;
}
if(win)
printf("You win.\n");
else if(lose)
printf("You lose.\n");
else
printf("You chickened out.\n");
}
return 0;
}
救济金发放(uva133)
#include <bits/stdc++.h>
using namespace std;
int n,k,m,a[30];
//m代表顺逆时针 p代表当前位置 s代表走几步
int go(int m,int p,int s)
{
while(s--)
{
do
{
p = (p+m+n-1)%n+1;
}while(a[p] == 0);
}
return p;
}
int main()
{
while(scanf("%d%d%d",&n,&k,&m) && n)
{
int cnt = n;
int p1 = n, p2 = 1;
for(int i = 1; i <= n; i++)
a[i] = 1;
while(cnt)
{
p1 = go(1,p1,k);
p2 = go(-1,p2,m);
cnt--;
printf("%3d",p1);
if(p1 != p2)
{
cnt--;
printf("%3d",p2);
}
a[p1] = a[p2] = 0;
if(cnt)
printf(",");
}
printf("\n");
}
return 0;
}
信息解码(uva213)
#include <bits/stdc++.h>
#define LOCAL
using namespace std;
char code[8][1<<8];
char readchar()
{
int ch;
while((ch = getchar()) == '\n' || ch == '\r');
return ch;
}
int readcode()
{
memset(code,0,sizeof(code));
code[1][0] = readchar(); //因为第二个样例后会有回车需要readchar
if(code[1][0] == EOF)
return 0;
int ch;
for(int i = 2; i <= 7; i++)
for(int j = 0; j < (1<<i)-1; j++)
{
ch = getchar();
if(ch == EOF)
return 0;
if(ch == '\n' || ch == '\r')
return 1;
code[i][j] = ch;
}
return 1;
}
int readint(int len)
{
int v = 0;
while(len--)
{
v = v*2+( readchar()-'0' );
}
return v;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(readcode())
{
int cnt = 0;
for(;;)
{
int len = readint(3);
if(len == 0)
break;
for(;;)
{
int t = readint(len);
if(t == (1 << len)-1)
break;
putchar(code[len][t]);
}
}
putchar('\n');
}
return 0;
}
追踪电子表格中的单元格
解法1
#include <bits/stdc++.h>
#define LOCAL
const int maxn = 100,BIG = 10000;
int r,c,d[maxn][maxn],ans[maxn][maxn],d2[maxn][maxn],cols[maxn];
using namespace std;
void Copy(char type,int q,int p)
{
if(type == 'R'){
for(int i = 1; i <= c; i++){
d[p][i] = d2[q][i];
}
}
else if(type == 'C'){
for(int i = 1; i <= r; i++){
d[i][p] = d2[i][q];
}
}
}
void Del(char type)
{
int cnt = type=='R'?r:c;
int cnt2 = 0;
memcpy(d2,d,sizeof(d));
for(int i = 1; i <= cnt; i++)
if(!cols[i])
Copy(type,i,++cnt2);
if(type == 'R'){
r = cnt2;
}
else if(type == 'C'){
c = cnt2;
}
}
void Ins(char type)
{
int cnt = type=='R'?r:c;
int cnt2 = 0;
memcpy(d2,d,sizeof(d));
for(int i = 1; i <= cnt; i++)
{
if(cols[i])
Copy(type,0,++cnt2);
Copy(type,i,++cnt2);
}
if(type == 'R')
r = cnt2;
else
c = cnt2;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int n;
int kase = 0;
int ar,ac,br,bc;
char cmd[12];
while(scanf("%d%d",&r,&c) && r)
{
scanf("%d",&n);
memset(d,0,sizeof(d));
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
d[i][j] = i*BIG+j;
for(int i = 0; i < n; i++)
{
scanf("%s",cmd);
if(cmd[0] == 'E'){
scanf("%d%d%d%d",&br,&bc,&ar,&ac);
int t = d[br][bc];
d[br][bc] = d[ar][ac];
d[ar][ac] = t;
}
else
{
int nn,x;
scanf("%d",&nn);
memset(cols,0,sizeof(cols));
for(int j = 0; j < nn; j++){
scanf("%d",&x);
cols[x] = 1;
}
if(cmd[0] == 'D')
Del(cmd[1]);
else
Ins(cmd[1]);
}
}
memset(ans,0,sizeof(ans));
for(int i = 1; i <= r; i++)
for(int j = 1; j <= c; j++)
{
ans[d[i][j]/BIG][d[i][j]%BIG] = i*BIG+j;
}
int na,xx,yy;
scanf("%d",&na);
if(kase != 0)
putchar('\n');
printf("Spreadsheet #%d\n",++kase);
for(int i = 0; i < na; i++)
{
scanf("%d%d",&xx,&yy);
printf("Cell data in (%d,%d) ",xx,yy);
if(ans[xx][yy])
printf("moved to (%d,%d)\n",ans[xx][yy]/BIG,ans[xx][yy]%BIG);
else
printf("GONE\n");
}
}
return 0;
}
解法2
#include <bits/stdc++.h>
#define LOCAL
const int maxn = 100;
using namespace std;
typedef struct cmd{
char cm[5];
int r1,c1,r2,c2;
int a,x[12];
}Cmd;
int r,c,n;
Cmd cmd[maxn];
int simulate(int &r0,int &c0)
{
for(int i = 0; i < n; i++)
{
if(cmd[i].cm[0] == 'E')
{
if(r0 == cmd[i].r1 && c0 == cmd[i].c1)
{r0 = cmd[i].r2;c0 = cmd[i].c2;}
else if(r0 == cmd[i].r2 && c0 == cmd[i].c2)
{r0 = cmd[i].r1;c0 = cmd[i].c1;}
}
else
{
int dr,dc;
dr = dc = 0;
for(int j = 0; j < cmd[i].a; j++)
{
int x = cmd[i].x[j];
if(cmd[i].cm[0] == 'I')
{
if(cmd[i].cm[1] == 'R' && r0 >= x)
dr++;
else if(cmd[i].cm[1] == 'C' && c0 >= x)
dc++;
}
else if(cmd[i].cm[0] == 'D')
{
if(cmd[i].cm[1] == 'R' && x == r0) return 0;
else if(cmd[i].cm[1] == 'C' && x == c0) return 0;
else if(cmd[i].cm[1] == 'R' && r0 > x) dr--;
else if(cmd[i].cm[1] == 'C' && c0 > x) dc--;
}
}
r0 += dr;
c0 += dc;
}
}
return 1;
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int kase = 0;
while(scanf("%d%d",&r,&c) && r)
{
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
scanf("%s",cmd[i].cm);
if(cmd[i].cm[0] == 'E')
scanf("%d%d%d%d",&cmd[i].r1,&cmd[i].c1,&cmd[i].r2,&cmd[i].c2);
else
{
scanf("%d",&cmd[i].a);
for(int j = 0; j < cmd[i].a; j++)
scanf("%d",&cmd[i].x[j]);
}
}
int nn,r0,c0;
scanf("%d",&nn);
if(kase != 0)
putchar('\n');
printf("Spreadsheet #%d\n",++kase);
for(int i = 0; i < nn; i++)
{
scanf("%d%d",&r0,&c0);
printf("Cell data in (%d,%d) ",r0,c0);
if(!simulate(r0,c0))
printf("GONE\n");
else
printf("moved to (%d,%d)\n",r0,c0);
}
}
return 0;
}
师兄帮帮忙(uva12412)
#include <bits/stdc++.h>
#define LOCAL
#define maxn 1000
#define maxl 100
#define EPS 1e-6
int n = 0;
char sid[maxn][maxl];
int cid[maxn];
char name[maxn][maxl];
int score[maxn][5]; //第五个记录总分
int removed[maxn] = {0};
using namespace std;
int menu()
{
int choice;
printf("Welcome to Student Performance Management System (SPMS).\n");
printf("\n");
printf("1 - Add\n");
printf("2 - Remove\n");
printf("3 - Query\n");
printf("4 - Show ranking\n");
printf("5 - Show Statistics\n");
printf("0 - Exit\n");
printf("\n");
scanf("%d",&choice);
return choice;
}
bool finded()
{
for(int i = 0; i < n; i++)
if(!removed[i] && strcmp(sid[i],sid[n]) == 0 )
return true;
return false;
}
void add()
{
for(;;)
{
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
scanf("%s",sid[n]);
if(strcmp(sid[n],"0") == 0)
break;
scanf("%d%s%d%d%d%d",&cid[n],name[n],&score[n][0],&score[n][1],&score[n][2],&score[n][3]);
if(!finded())
{
score[n][4] = score[n][0]+score[n][1]+score[n][2]+score[n][3];
n++;
}
else
printf("Duplicated SID.\n");
}
}
int ranks(int index)
{
int r = 1;
for(int i = 0; i < n; i++)
if(!removed[i] && score[i][4] > score[index][4])
r++;
return r;
}
void DQ(int isq)
{
char s[maxl];
for(;;)
{
int r = 0;
printf("Please enter SID or name. Enter 0 to finish.\n");
scanf("%s",s);
if(strcmp(s,"0") == 0)
break;
for(int i = 0; i < n; i++) if(!removed[i])
{
if(strcmp(s,sid[i]) == 0 || strcmp(s,name[i]) == 0){
if(isq){
printf("%d %s %d %s %d %d %d %d %d %.2f\n",ranks(i),sid[i],cid[i],name[i],score[i][0],score[i][1],score[i][2],
score[i][3],score[i][4],(double)score[i][4]/4+EPS);
}
else
{
removed[i] = 1;
r++;
}
}
}
if(!isq)
printf("%d student(s) removed.\n",r);
}
}
const char course[][18] = {"Chinese","Mathematics","English","Programming"};
int cnt[5]; //全过、过3、过2、过1、全没
void analyize(int c)
{
memset(cnt,0,sizeof(cnt));
for(int i = 0; i < n; i++)
if(!removed[i] && (cid[i] == c || c == 0))
{
int flag = 0;
for(int j = 0; j < 4; j++)
if(score[i][j] >= 60)
flag++;
if(flag == 4)
cnt[0]++;
else if(flag == 3)
cnt[1]++;
else if(flag == 2)
cnt[2]++;
else if(flag == 1)
cnt[3]++;
else
cnt[4]++;
}
}
double analyize_ave(int c,int index,int &passed,int &failed)
{
double sum = 0, ave;
passed = failed = 0;
for(int i = 0; i < n; i++)
if(!removed[i] && (c == 0 || c == cid[i]))
{
if(score[i][index] >= 60)
passed++;
else
failed++;
sum += score[i][index];
}
if(passed+failed == 0)
return 0;
ave = (double)sum/(double)(passed+failed);
return ave;
}
void show()
{
int mod;
printf("Please enter class ID, 0 for the whole statistics.\n");
scanf("%d",&mod);
for(int i = 0; i < 4; i++)
{
int passed,failed;
double ave = analyize_ave(mod,i,passed,failed);
printf("%s\n",course[i]);
printf("Average Score: %.2f\n", ave+EPS);
printf("Number of passed students: %d\n", passed);
printf("Number of failed students: %d\n", failed);
printf("\n");
}
analyize(mod);
printf("Overall:\n");
printf("Number of students who passed all subjects: %d\n", cnt[0]);
printf("Number of students who passed 3 or more subjects: %d\n", cnt[0]+cnt[1]);
printf("Number of students who passed 2 or more subjects: %d\n", cnt[0]+cnt[1]+cnt[2]);
printf("Number of students who passed 1 or more subjects: %d\n", cnt[0]+cnt[1]+cnt[2]+cnt[3]);
printf("Number of students who failed all subjects: %d\n", cnt[4]);
printf("\n");
}
int main()
{
int choice;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while( (choice = menu()) != 0 )
{
switch(choice)
{
case 1:add();break;
case 2:DQ(0);break;
case 3:DQ(1);break;
case 4:printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");break;
case 5:show();break;
}
}
return 0;
}
象棋(uva1589)
炮:垂直方向或竖直方向移动任意格子,若想吃棋子,当且仅当二者之间有一颗棋子
车:垂直或水平方向走任意格子,中间不可有棋子
马:日子型,防止蹩马腿
帅:当轮到红方时,帅与将在同一列且中间没有棋子时将军。
注意:本题将军可以吃红子。
#include <bits/stdc++.h>
#define LOCAL
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; //将军的四个方向
int hdir[8][2] = { {2,1},{2,-1},{-2,1},{-2,-1},{1,2},{-1,2},{1,-2},{-1,-2} }; //马的八个方向对应马脚为gdir
int board[11][10];
using namespace std;
typedef struct Pos
{
char type;
int x;
int y;
Pos(char _type = 0, int _x = 0, int _y = 0): type(_type),x(_x),y(_y){}
}Pos;
//判断黑将与当前棋子中间相差棋子数(水平方向)
int hn(int px,int py,int y)
{
int cnt = 0;
int low = min(py,y);
int high = max(py,y);
for(low += 1; low < high; low++)
if(board[px][low])
cnt++;
return cnt;
}
//垂直方向
int vn(int px,int py,int x)
{
int cnt = 0;
int low = min(px,x);
int high = max(px,x);
for(low += 1; low < high; low++)
if(board[low][py])
cnt++;
return cnt;
}
//判断位置是否合理
bool check(int x,int y,int isG)
{
if(isG)
return (x >= 1 && x <= 3) && (y >=4 && y <= 6);
else
return (x >= 1 && x <= 10) && (y >= 1 && y <= 9);
}
int main()
{
char type[5];
int x,y;
int n, px, py;
bool live;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif
while(scanf("%d%d%d",&n,&px,&py) && n)
{
vector<Pos> red;
bool ans = true;
memset(board,0,sizeof(board));
while(n--)
{
scanf("%s%d%d",type,&x,&y);
board[x][y] = 1;
red.push_back(Pos(type[0],x,y));
}
for(int i = 0; i < 4; ++i)
{
int xx = px+dir[i][0], yy = py+dir[i][1];
if(check(xx,yy,1)) //将军位置合法
{
live = true;
for(auto t: red)
{
if(t.x == xx && t.y == yy) //红子被吃
continue;
if(t.type == 'G' && yy == t.y && vn(xx,yy,t.x) == 0) live = false;
else if(t.type == 'R' && ( (yy == t.y && vn(xx,yy,t.x) == 0) || (xx == t.x && hn(xx,yy,t.y) == 0)) )
live = false;
else if(t.type == 'C' && ( (yy == t.y && vn(xx,yy,t.x)== 1) || (xx == t.x && hn(xx,yy,t.y) == 1)) )
live = false;
else if(t.type == 'H'){
for(int j = 0; j < 8; ++j)
{
int hx = t.x+hdir[j][0], hy = t.y+hdir[j][1];
int fx = t.x+dir[j/2][0], fy = t.y+dir[j/2][1];
if(board[fx][fy])
continue;
if(hx == xx && hy == yy && check(fx,fy,0)) {live = false;break;}
}
}
if(!live)
break;
}
}
if(check(xx,yy,1) && live){
ans = false;
break;
}
}
printf("%s\n",ans?"YES":"NO");
}
return 0;
}
正方形(uva201)
#include <bits/stdc++.h>
#define LOCAL
using namespace std;
int v[10][10]; //存放竖直相连的点
int h[10][10]; //存放水平相连的点
int cnsquare(int l,int n)
{
int cnt = 0;
bool flag;
for(int i = 1; i <= n-l; ++i)
for(int j = 1; j <= n-l; ++j)
{
flag = true;
for(int k = 0; k < l; ++k)
{
if(!h[i][j+k] || !h[i+l][j+k] || !v[i+k][j] || !v[i+k][j+l])
{
flag = false;
break;
}
}
if(flag)
cnt++;
}
return cnt;
}
int main()
{
int n;
int t;
char type[5];
int x,y;
int cnt = 0;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif
while(~scanf("%d%d",&n,&t))
{
memset(h,0,sizeof(h));
memset(v,0,sizeof(v));
while(t--)
{
scanf("%s%d%d",type,&x,&y);
if(type[0] == 'H')
h[x][y] = 1;
else
v[y][x] = 1;
}
if(cnt)
{ putchar('\n'); printf("**********************************\n");putchar('\n');}
printf("Problem #%d\n\n",++cnt);
int f = 0;
for(int l = 1; l <= n; ++l)
{
int ans = cnsquare(l,n);
if(ans)
{ printf("%d square (s) of size %d\n",ans,l); f = 1;}
}
if(!f)
printf("No completed squares can be found.\n");
}
return 0;
}
黑白棋(uva220)
#include <stdio.h>
#include <string.h>
#define LOCAL
int dir[8][2] = { {1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,-1},{-1,1},{1,1} };
char board[9][9];
using namespace std;
//斜向的判断(左上组合:-1,-1 右上组合:-1,1 左下组合:1,-1 右下组合:1,1)
bool s_check(char type,int v,int h,int x,int y)
{
while(true)
{
x += v;
y += h;
if(x == 0 || x == 9 || y == 0 || y == 9 || board[x][y] == '-')
break;
if(board[x][y] == type)
return true;
}
return false;
}
//竖直方向的判断(上:-1 下:1)
bool v_check(char type,int v,int x,int y)
{
while(true)
{
x += v;
if(x == 0 || x == 9 || board[x][y] == '-')
break;
if(board[x][y] == type)
return true;
}
return false;
}
//水平方向的判断(左:-1 右:1)
bool h_check(char type,int h,int x,int y)
{
while(true)
{
y += h;
if(x == 0 || x == 9 || y == 0 || y == 9 || board[x][y] == '-')
break;
if(board[x][y] == type)
return true;
}
return false;
}
//斜向的改变
void s_change(char type,int v,int h,int x,int y)
{
while(true)
{
x += v;
y += h;
if(x == 0 || x == 9 || y == 0 || y == 9)
break;
if(board[x][y] == type)
break;
board[x][y] = type;
}
}
//横向的改变
void h_change(char type,int h,int x,int y)
{
while(true)
{
y += h;
if(x == 0 || x == 9 || y == 0 || y == 9 )
break;
if(board[x][y] == type)
break;
board[x][y] = type;
}
}
//竖直方向的改变
void v_change(char type,int v,int x,int y)
{
while(true)
{
x += v;
if(x == 0 || x == 9 || y == 0 || y == 9 )
break;
if(board[x][y] == type)
break;
board[x][y] = type;
}
}
void mrc(int x,int y,char type) //type代表该下的棋子
{
char pos = type == 'W'?'B':'W';
board[x][y] = type;
for(int i = 0; i < 8; ++i)
{
int xx = x+dir[i][0], yy = y+dir[i][1];
if(board[xx][yy] != pos)
continue;
if(i == 0 || i == 1) //上下
{
if(v_check(type,dir[i][0],xx,yy))
{
v_change(type,dir[i][0],x,y);
}
}
else if(i == 2 || i == 3) //左右
{
if(h_check(type,dir[i][1],xx,yy))
{
h_change(type,dir[i][1],x,y);
}
}
else //斜向
{
if(s_check(type,dir[i][0],dir[i][1],xx,yy))
{
s_change(type,dir[i][0],dir[i][1],x,y);
}
}
}
int b,w;
b = w = 0;
for(int i = 1; i <= 8; ++i)
for(int j = 1; j <= 8; ++j)
{
if(board[i][j] == 'W')
w++;
else if(board[i][j] == 'B')
b++;
}
printf("Black - %2d White - %2d\n",b,w);
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int t;
scanf("%d",&t);
getchar();
int first = 1;
while(t--)
{
if(!first)
{
putchar('\n');
}
first = 0;
char ch,type,pos;
int flag = 1;
memset(board,0,sizeof(board));
for(int i = 1; i <= 8; ++i)
{
for(int j = 1; j <= 8; ++j)
scanf("%c",&board[i][j]);
getchar();
}
type = getchar();
getchar();
while( ch = getchar())
{
if(ch == 'L')
{
getchar();
flag = 0;
pos = type=='W'?'B':'W';
int cnt = 0;
for(int i = 1; i <= 8; ++i)
for(int j = 1; j <= 8; ++j)
{
if(board[i][j] == '-')
{
for(int k = 0 ; k < 8 ; ++k)
{
int xx = i+dir[k][0],yy = j+dir[k][1];
if(board[xx][yy] != pos)
continue;
if(k == 0 || k == 1)
{
if(v_check(type,dir[k][0],i,j))
{ if(cnt!=0) putchar(' ');printf("(%d,%d)",i,j);cnt++;flag = 1;break;}
}
else if(k == 2 || k == 3)
{
if(h_check(type,dir[k][1],i,j))
{if(cnt!=0) putchar(' ');cnt++;printf("(%d,%d)",i,j);flag=1;break;}
}
else
{
if(s_check(type,dir[k][0],dir[k][1],i,j))
{
if(cnt!=0) putchar(' ');cnt++;
printf("(%d,%d)",i,j);flag=1;break;
}
}
}
}
}
if(flag == 0)
printf("No legal move.\n");
else
putchar('\n');
}
else if(ch == 'M')
{
char num[5];
scanf("%s",num);
getchar();
if(flag == 0)
type = type=='W'?'B':'W';
mrc(num[0]-'0',num[1]-'0',type);
type = type=='W'?'B':'W';
}
else if(ch == 'Q')
{
getchar();
for(int i = 1; i <= 8; ++i){
for(int j = 1; j <= 8; ++j)
printf("%c",board[i][j]);
putchar('\n');
}
break;
}
}
}
return 0;
}
骰子涂色
#include <stdio.h>
#include <string.h>
#include <iostream>
#define LOCAL
using namespace std;
bool check(char a[],char b[])
{
for(int i = 1; i <= 6; ++i)
if(a[i] != b[i])
return false;
return true;
}
//x轴右旋n*90度
void x_rotate(char a[],int n)
{
char a2;
while(n--)
{
a2 = a[2];
a[2] = a[3];
a[3] = a[5];
a[5] = a[4];
a[4] = a2;
}
}
//y轴右旋n*90度
void y_rotate(char a[],int n)
{
char a1;
while(n--)
{
a1 = a[1];
a[1] = a[3];
a[3] = a[6];
a[6] = a[4];
a[4] = a1;
}
}
//z轴下旋n*90度
void z_rotate(char a[],int n)
{
char a2;
while(n--)
{
a2 = a[2];
a[2] = a[1];
a[1] = a[5];
a[5] = a[6];
a[6] = a2;
}
}
int main()
{
char str[16];
char a[10],b[10],t[10];
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(~scanf("%s",str))
{
for(int i = 0; i < 6; ++i)
{ a[i+1] = str[i]; t[i+1] = str[i];}
for(int i = 6,j = 1; i < 12; ++i,++j)
b[j] = str[i];
bool ischeck = false;
for(int i = 0; i < 4 && !ischeck; ++i)
for(int j = 0; j < 4 && !ischeck; ++j)
for(int k = 0; k < 4 && !ischeck; ++k)
{
memcpy(a,t,sizeof(t));
x_rotate(a,i);
y_rotate(a,j);
z_rotate(a,k);
ischeck = check(a,b);
}
printf("%s\n",ischeck?"TRUE":"FALSE");
}
return 0;
}
IP网络(uva1590)
#include <stdio.h>
#include <iostream>
#define LOCAL
using namespace std;
void copyn(int m[],int num[],int n)
{
for(int i = 0; i < n; ++i)
m[i] = num[i];
}
void tobianary(int num[],int bi[])
{
int t;
for(int i = 0; i < 4; ++i)
{
for(int j = i*8+7; j >= i*8; --j)
{
t = num[i]%2;
bi[j] = t;
num[i] /= 2;
}
}
}
void turnback(int num[],int bi[])
{
for(int i = 0; i < 4; ++i)
{
num[i] = 0;
for(int j = i*8; j <= i*8+7; ++j)
{
num[i] = num[i]*2+bi[j];
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int n;
int num[4];
int ma[4],mi[4];
int low[36],high[36];
while(~scanf("%d",&n))
{
scanf("%d.%d.%d.%d",&num[0],&num[1],&num[2],&num[3]);
copyn(ma,num,4);copyn(mi,num,4);
n--;
while(n--)
{
scanf("%d.%d.%d.%d",&num[0],&num[1],&num[2],&num[3]);
for(int i = 0; i < 4; ++i)
{
if(num[i] > ma[i])
{
copyn(ma,num,4);
break;
}
else if(num[i] < ma[i])
break;
}
for(int i = 0; i < 4; ++i)
{
if(num[i] < mi[i])
{
copyn(mi,num,4);
break;
}
else if(num[i] > mi[i])
break;
}
}
tobianary(mi,low);
tobianary(ma,high);
int cnt = 0;
for(int i = 0; i < 32; ++i,++cnt)
if(low[i] != high[i])
break;
for(int i = cnt; i < 32; ++i)
low[i] = 0;
turnback(num,low);
for(int i = 0; i < 4; ++i)
{
printf("%d",num[i]);
if(i!=3)
putchar('.');
else
putchar('\n');
}
int mask[36] = {0};
for(int i = 0; i < cnt; ++i)
mask[i] = 1;
turnback(num,mask);
for(int i = 0; i < 4; ++i)
{
printf("%d",num[i]);
if(i!=3)
putchar('.');
else
putchar('\n');
}
}
return 0;
}
莫尔斯电码(uva508)
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <map>
#include <iterator>
#define LOCAL
using namespace std;
string code[200]; //存放莫斯编码
map<string,vector<string>> morse; //Key为莫斯编码,存放着原字符串(可能多个字符串对应一个编码)
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
char c;
string s;
while(cin >> c && c != '*')
{
cin >> code[c];
}
while(cin >> s && s != "*")
{
string st;
for(auto p:s)
st += code[p];
morse[st].push_back(s);
}
while(cin >> s && s != "*")
{
if(morse.find(s) != morse.end())
{
cout << *morse[s].begin();
if(morse[s].size() > 1)
cout << "!";
}
else
{
int mi = 0x3ffff;
string ans;
for(auto p:morse)
{
if(p.first.substr(0,s.size()) == s || s.substr(0,p.first.size()) == p.first)
{
int i = abs((long)s.size()-(long)p.first.size());
if(mi > i)
{
mi = i;
ans = *p.second.begin();
}
}
}
cout << ans << "?";
}
cout << endl;
}
return 0;
}
RAID技术(uva509)
#include <iostream>
#include <string>
#define LOCAL
using namespace std;
char mod;
int b,s,d;
string disk[10];
bool check()
{
for(decltype(disk[0].size()) i = 0; i < disk[0].size(); ++i)
{
int e = mod=='E'?0:1;
int idx = -1,cnt = 0;
for(int j = 0; j < d; ++j)
{
if(disk[j][i] == 'x') cnt++,idx = j;
else
e ^= disk[j][i]-'0';
}
if(cnt == 1) disk[idx][i] = e==0?'0':'1';
else if(cnt > 1 || cnt == 0 && e != 0) return false;
}
return true;
}
void show()
{
const char *dict ="0123456789ABCDEF";
int num = 0;
string ans;
for(int i = 0; i < b; ++i)
for(int j = 0;j < d; ++j)
if(i%d != j) ans += disk[j].substr(i*s,s);
if(ans.size()%4!=0)
{string t(4-ans.size()%4,'0');ans +=t;}
for(int i = 0; i < ans.size()/4; ++i)
{
string st;
num = 0;
st = ans.substr(i*4,4);
for(int j = 0; j <= 3; ++j)
num = num*2+st[j]-'0';
printf("%c",dict[num]);
}
putchar('\n');
}
int main()
{
int cnt = 0;
#ifdef LOCAL-
freopen("data.in","r",stdin);
#endif // LOCAL
while(scanf("%d",&d) && d)
{
scanf("%d%d",&s,&b);
cin >> mod;
for(int i = 0; i < d; ++i)
cin >> disk[i];
if(check())
{
printf("Disk set %d is valid, contents are: ",++cnt);
show();
}
else
{
printf("Disk set %d is invalid.\n",++cnt);
}
}
return 0;
}
特别困的学生(uva12108)
#include <iostream>
#define LOCAL
using namespace std;
int wnum,n;
bool repe(int save[],int c[])
{
for(int i = 0; i < n; ++i)
if(save[i] != c[i])
return false;
return true;
}
int weak(int a[],int b[],int c[])
{
int num = 0;
for(int i = 0; i < n; ++i)
{
c[i] = (c[i]+a[i]+b[i])%(a[i]+b[i])+1;
if(c[i] > a[i] && c[i] <= a[i]+b[i])
{
if(wnum*2 >= n && c[i] == a[i]+1)
{ num++; c[i] = 1;}
}
else
num++;
}
return num;
}
int main()
{
int kase = 0;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(scanf("%d",&n) && n)
{
int a[12],b[12],c[12],save[12];
int cnt = 1;
wnum = 0;
for(int i = 0; i < n; ++i)
{
scanf("%d%d%d",&a[i],&b[i],&c[i]);
save[i] = c[i];
if(c[i] <= a[i])
wnum++;
}
printf("Case %d: ",++kase);
if(wnum == n)
printf("1\n");
else{
while(true)
{
cnt++;
wnum = weak(a,b,c);
if(wnum == n)
{ printf("%d\n",cnt);break;}
else if(repe(save,c))
{
printf("-1\n");
break;
}
}
}
}
return 0;
}
数据挖掘(uva1591)
#include <iostream>
#include <climits>
#define LOCAL
/*
如何判断AB合法:Q数组一个数据占据空间sq,AB合法时偏移量应该大于等于sq
Qofs’(i) = (Pofs(i) + Pofs(i) << A) >> B
其中Pofs每次增加sp可以理解为Q的偏移量每次增加(sp+(sp<<i))>>j必须大于等于sq
*/
/*
计算空间K:有n-1个元素,K为n-1个元素的偏移量加上一个Q元素的空间sq
*/
using namespace std;
int main()
{
long long n,sp,sq;
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
while(~scanf("%lld%lld%lld",&n,&sp,&sq))
{
long long k = LLONG_MAX, A, B;
for(int i = 0; i < 32; ++i)
for(int j = 0; j < 32; ++j)
{
if( (sp+(sp<<i))>>j >= sq && k > ((sp*(n-1)+(sp*(n-1)<<i))>>j)+sq )
{
k = ((sp*(n-1)+(sp*(n-1)<<i))>>j)+sq;
A = i;
B = j;
}
}
printf("%lld %lld %lld\n",k,A,B);
}
return 0;
}
洪水(uva815)
#include <iostream>
#include <algorithm>
#include <vector>
#define LOCAL
using namespace std;
//注意考虑水的总体积为0
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
int n,m;
int t;
int sum;
int kase = 0;
while(scanf("%d%d",&n,&m) && n)
{
int cnt = 1;
double ans = 0;
vector<int> v(n*m);
for(int i = 0; i < n*m; ++i)
{
scanf("%d",&t);
v[i] = t;
}
scanf("%d",&sum);
bool flag = false;
if(sum == 0) flag = true;
sort(v.begin(),v.end());
int h,water;
for(int i = 0; i < m*n-1; ++i)
{
h = v[i+1]-v[i];
water = h*100*cnt;
if(water < sum)
{
sum -= water;
cnt++;
}
else
{
ans = v[i]+(double)sum/(100*cnt);
sum = 0;
break;
}
}
if(sum != 0)
{
ans = v[m*n-1]+(double)sum/(100*cnt);
}
printf("Region %d\n",++kase);
printf("Water level is %.2lf meters.\n",ans);
printf("%.2lf percent of the region is under water.\n",flag?0.0:(double)(cnt)/(n*m)*100);
putchar('\n');
}
return 0;
}