Problem 1055 赋值问题
Accept: 1255 Submit: 6950
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
在很多程序设计语言中,忘记给变量赋初值的错误常令人头疼。请编程求出含N(0≤N≤100)行的程序段运行以后有哪些变量中有确定的值。 在下面的问题中,最开始仅有变量a中有确定的值。变量为单个小写字母,每行恰好有三个字符,中间一个是赋值运算符'='。
Input
输入有多组数据,每组数据的第一行有一个整数N,表示程序段的行数。以下N行,每行3个字符,为一条语句。最后一组数据N=-1表示输入结束,不需要处理。
Output
对每一组数据输出一行结果,按字母表顺序给出所有有确定值的变量名。如果没有变量有确定的值,输出none。
Sample Input
4
b=a
c=d
d=b
e=f
-1
Sample Output
a b d
这道题是端午专场比赛的时候做的,当时数据有限,没有理解清楚题的意思,这句话“最开始仅有变量a中有确定的值”,意思是输入0的时候也输出的是a,不是none。题虽然很水,但是没有做出来!这里代码,可以好好理解一下题意。
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,vis[26];
char a,b,c;;
while(scanf("%d",&n))
{
if(n==-1)
break;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(i=0;i<n;i++)
{
getchar();
scanf("%c%c%c",&a,&b,&c);
vis[a-'a']=vis[c-'a'];
}
int flag=1;int sum=0;
for(i=0;i<26;i++)
{
if(vis[i])
{
sum++;
if(sum==1)
printf("%c",i+'a');
else
printf(" %c",i+'a');
flag=0;
}
}
if(flag==1) printf("none");
printf("\n");
}
}
Description
Input
Output
每组数据输出两个数A和B,A<B, 表示A,B两种食物是不可数的。A,B中间隔一个空格,行末要换行。
Sample Input
2 10 1 1 1 2 2 2 3 3 4 4 20 0 1 0 1 2 3 4 2 3 4 65535 65535 65535 789456123 789456123 789456123 10 10 10 10
Sample Output
1 2 65535 789456123
交换两个整数的值而不必用第三个参数,比如
a = 9;
b = 11;
a=a^b; 1001^1011=0010
b=b^a; 1011^0010=1001
a=a^b; 0010^1001=1011
a = 11;
b = 9;
a = 9;
b = 11;
a=a^b; 1001^1011=0010
b=b^a; 1011^0010=1001
a=a^b; 0010^1001=1011
a = 11;
b = 9;
这里就是这个的一个运用,两个相同的数异或之后为0,只剩下两个为奇数次数的数的异或,在运用上面的方法把他们取出来就OK,没有想到啊、、、位运算在编程中相当的有用,简单且有效,得找时间好好的学习一下。上代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
__int64 a[1000002];
int main()
{
__int64 m,n,i,j,s,k,t;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d",&n);
s=0;
for(i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
s^=a[i];
}
m=s,k=s,j=0;
while(m)
{
j++;
if(m%2==1) break;
m/=2;
}
j--;
for(i=0;i<n;i++)
if(a[i]>>j&1)
s^=a[i];
k^=s;
printf("%I64d %I64d\n",min(k,s),max(k,s));
}
return 0;
}
首先可以直接用递归搜索进行,关键点是对搜索边界的控制上,代码:
#include <cstdio>
#include <cstring>
int map[55][55][55];
bool low[55][55][55];
int l,w,h,m,count;
int ac(int x,int y,int z)
{
if(x>=0 && x<l && y>=0 && y<w && z>=0 && z<h && low[x][y][z])
return 1;
else
return 0;
}
void map_search(int i,int j,int k,int m)
{
if(ac(i,j,k+1) && map[i][j][k+1]<=(map[i][j][k]+m) && map[i][j][k+1]>=(map[i][j][k]-m))
{
low[i][j][k+1]=false;
map_search(i,j,k+1,m);
}
if(ac(i,j,k-1) && map[i][j][k-1]<=(map[i][j][k]+m) && map[i][j][k-1]>=(map[i][j][k]-m))
{
low[i][j][k-1]=false;
map_search(i,j,k-1,m);
}
if(ac(i,j+1,k) && map[i][j+1][k]<=(map[i][j][k]+m) && map[i][j+1][k]>=(map[i][j][k]-m))
{
low[i][j+1][k]=false;
map_search(i,j+1,k,m);
}
if(ac(i,j-1,k) && map[i][j-1][k]<=(map[i][j][k]+m) && map[i][j-1][k]>=(map[i][j][k]-m))
{
low[i][j-1][k]=false;
map_search(i,j-1,k,m);
}
if(ac(i+1,j,k) && map[i+1][j][k]<=(map[i][j][k]+m) && map[i+1][j][k]>=(map[i][j][k]-m))
{
low[i+1][j][k]=false;
map_search(i+1,j,k,m);
}
if(ac(i-1,j,k) && map[i-1][j][k]<=(map[i][j][k]+m) && map[i-1][j][k]>=(map[i][j][k]-m))
{
low[i-1][j][k]=false;
map_search(i-1,j,k,m);
}
}
int main()
{
while(scanf("%d%d%d",&l,&w,&h)!=EOF)
{
memset(low,true,sizeof(low));
memset(map,0,sizeof(map));
count=0;
scanf("%d",&m);
for(int i=0;i<l;i++)
{
for(int j=0;j<w;j++)
{
for(int k=0;k<h;k++)
{
scanf("%d",&map[i][j][k]);
}
}
}
for(int i=0;i<l;i++)
{
for(int j=0;j<w;j++)
{
for(int k=0;k<h;k++)
{
if(low[i][j][k])
{
count++;
low[i][j][k]=false;
map_search(i,j,k,m);
//printf("yes\n");
}
}
}
}
printf("%d\n",count);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
struct Node
{
int x,y,z;
};
int map[55][55][55];
bool lis[55][55][55];
int m;
int fang[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
queue<Node>v;
int x,y,z,l,w,h,count;
int ac(int x,int y,int z)
{
if(x>=0 && x<l && y>=0 && y<w && z>=0 && z<h && lis[x][y][z])
return 1;
else
return 0;
}
int main()
{
Node aa,bb;
while(~scanf("%d%d%d",&l,&w,&h))
{
scanf("%d",&m);
memset(map,-10000,sizeof(map));
memset(lis,true,sizeof(lis));
for(int i=0;i<l;i++)
for(int j=0;j<w;j++)
for(int k=0;k<h;k++)
scanf("%d",&map[i][j][k]);
count=0;
while(!v.empty())
v.pop();
for(int i=0;i<l;i++)
{
for(int j=0;j<w;j++)
{
for(int k=0;k<h;k++)
{
if(lis[i][j][k])
{
aa.x=i; aa.y=j; aa.z=k;
v.push(aa);
while(!v.empty())
{
aa=v.front();
v.pop();
for(int ii=0;ii<6;ii++)
{
bb.x=aa.x+fang[ii][0];
bb.y=aa.y+fang[ii][1];
bb.z=aa.z+fang[ii][2];
if(ac(bb.x,bb.y,bb.z) && map[bb.x][bb.y][bb.z] <= map[aa.x][aa.y][aa.z]+m && map[bb.x][bb.y][bb.z]>=map[aa.x][aa.y][aa.z]-m)
{
lis[bb.x][bb.y][bb.z]=false;
v.push(bb);
}
}
}
count++;
}
}
}
}
printf("%d\n",count);
}
return 0;
}