您的位置:首页 > 其它

UVA 196 Spreadsheet 解题报告

2013-06-16 22:34 435 查看
题意:给定你一个表格,其中有些表格是加法表达式,求出这个表格的值并输出

解题思路:用结构体存储一个格子。先以字符串的形式输入,然后再处理,这里要注意的是加法表达式里面的元素不一定是一个值也有可能是一个表达式,所以要深搜求值

解题代码:

// File Name: uva196.c
// Author: darkdream
// Created Time: 2013年06月16日 星期日 20时29分05秒

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<ctype.h>

struct node
{
int num;
int isnum;
char str[100];
};
struct node map[1000][1000];
int n , m;
int dfs(int x,int y)
{
// printf("%d %d\n",x,y);
if(map[x][y].isnum == 1)
{
//printf("%d**%d\n",x,y);
return map[x][y].num;

}
int sum = 0 ;
int tx = 0;
int ty = 0;
int len = strlen(map[x][y].str);
char *p = map[x][y].str;
for(int i = 1;i <= len; i ++)
{
if(i == len || p[i] == '+')
{
sum += dfs(ty,tx);
tx = 0 ;
ty = 0 ;
continue;
}
if(isalpha(p[i]))
{
tx = tx*26 +(p[i] - 'A' + 1);
}
else if(isdigit(p[i]))
{

ty = ty*10 + (p[i] -'0' );
}
}
map[x][y].num = sum;
map[x][y].isnum = 1;
return sum;

}
int main(){

//freopen("/home/plac/problem/input.txt","r",stdin);
//freopen("/home/plac/problem/output.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
scanf("%d %d",&m,&n);
for(int i = 1; i <= n;i ++)
{
for(int j = 1;j <= m ;j ++)
{  scanf("%s",map[i][j].str);

if(map[i][j].str[0] != '=')
{
sscanf(map[i][j].str,"%d",&map[i][j].num);
map[i][j].isnum = 1;
}

}
}
for(int i = 1; i <= n;i ++)
for(int j = 1; j <= m;j ++)
{
if(map[i][j].isnum == 0)
{
dfs(i,j);
}
}
for(int i =1;i <= n;i ++)
{
for(int j =1 ;j <= m; j ++)
{
if(j != 1)
printf(" ");
printf("%d",map[i][j].num);
}
printf("\n");
}
}
return 0 ;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: