hdu 4951 乘法表

http://acm.hdu.edu.cn/showproblem.php?pid=4951

依照我原先的想法是 先找出ans[0] 和ans[1]来,这个好找吧,要是有一行全部是相等的数组成那这行的序号就是ans[0], 要是有一[i,j],i*j=ans[0] i ,那么ans[j]=1,  找到了ans[0]和ans[1] ,然后根据已知的遍历推算出其他的结果。

 

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<map>
  4 #include<algorithm>
  5 #include<cstring>
  6 using namespace std;
  7 
  8 struct node
  9 {
 10     int x,y,zhi;
 11 } p[505][505];
 12 
 13 bool vis[505];
 14 int ans[505];
 15 
 16 int get(int x,int y,int c)
 17 {
 18     int w[505],num=0;
 19     do
 20     {
 21         w[num++]=y%10;
 22         y/=10;
 23     }
 24     while(y);
 25 
 26     do
 27     {
 28         w[num++]=x%10;
 29         x/=10;
 30     }
 31     while(x);
 32 
 33     int sum=0;
 34     for(int i=0,jie=1; i<num; i++)
 35     {
 36         sum+=w[i]*jie;
 37         jie*=c;
 38     }
 39     return sum;
 40 }
 41 
 42 void solve(int n)
 43 {
 44     int count1=2,coun=1;
 45     while(1)
 46     {
 47         for(int i=0; i<n; i++)
 48             for(int j=0; j<n; j++)
 49             {
 50 
 51                 if(vis[p[i][j].x]&&vis[p[i][j].y])
 52                 {
 53                     if(p[i][j].zhi==-1)
 54                         p[i][j].zhi=get(ans[p[i][j].x],ans[p[i][j].y],n);
 55                     if(p[i][j].zhi!=0)
 56                     {
 57                         if(vis[i]&&!vis[j])
 58                         {
 59                             ans[j]=p[i][j].zhi/ans[i];
 60                             vis[j]=true;
 61                             count1++;
 62                         }
 63                         else if(!vis[i]&&vis[j])
 64                         {
 65 
 66                             ans[i]=p[i][j].zhi/ans[j];
 67                             vis[i]=true;
 68                             count1++;
 69                         }
 70                         else if(!vis[i]&&i==j)
 71                         {
 72 
 73                             ans[i]=p[i][j].zhi/2;
 74                             vis[i]=true;
 75                             count1++;
 76                         }
 77                         if(count1>=n)
 78                             return ;
 79                     }
 80                 }
 81             }
 82     }
 83 }
 84 
 85 int main()
 86 {
 87     int n,i,j,a,b,c;
 88     for(int i=0;i<55;i++)
 89         {
 90             scanf("%d%d%d",&a,&b,&c);
 91             printf("get  %d\n",get(a,b,c));
 92         }
 93 
 94     while(~scanf("%d",&n),n)
 95     {
 96         memset(vis,false,sizeof(vis));
 97         for( i=0; i<n; i++)
 98             for( j=0; j<n; j++)
 99             {
100                 scanf("%d%d",&p[i][j].x,&p[i][j].y);
101                 p[i][j].zhi=-1;
102             }
103         for( i=0; i<n; i++)
104         {
105             for( j=0; j<n; j++)
106                 if(p[i][j].x!=p[i][j].y)
107                     break;
108             if(j==n)
109             {
110                 ans[p[i][0].x]=0;
111                 vis[p[i][0].x]=true;
112                 break;
113             }
114         }
115 
116         for( i=0; i<n; i++)
117         {
118             for( j=0; j<n; j++)
119                 if(!vis[i]&&!vis[j]&&ans[p[i][j].x]==0&&i*j==p[i][j].y)
120                 {
121                     if(i==p[i][j].y)
122                     {
123                         ans[j]=1;
124                         vis[j]=true;
125                     }
126                     else
127                     {
128                         ans[i]=1;
129                         vis[i]=true;
130                     }
131                     break;
132                 }
133             if(j!=n)
134                 break;
135         }
136 
137         solve(n);
138         for( i=0; i<n; i++)
139             printf("%d ",ans[i]);
140         printf("\n");
141 
142     }
143     return 0;
144 }

 

上面的结果当然是错的, 起码每次找p[i][j].zhi 的时候就必须得用大数    = =

 

在网上看到一个很简洁的思路 膜拜一下~ 

http://www.cnblogs.com/yuiffy/p/3914595.html

 

 

 1 #include <stdio.h>
 2 #include<iostream>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 int a[505][1005],ans[505];
 7 bool vis[505];
 8 
 9 int main()
10 {
11     int i,j,n,cas=1;
12     while(~scanf("%d",&n),n)
13     {
14         for(i=0;i<n;i++)
15             for( j=0;j<2*n;j+=2)
16                 scanf("%d%d",&a[i][j],&a[i][j+1]);
17         for(i=0;i<n;i++)
18         {
19             for(j=0;j<2*n;j+=2)
20                  if(a[i][j]!=a[i][j+1])
21                      break;
22            if(j>=2*n)
23            {
24                ans[0]=i;
25 
26                break;
27            }
28         }
29         for(i=0;i<n;i++)
30         {
31             if(i==ans[0])
32                 continue;
33             memset(vis,false,sizeof(vis));
34             int num=0;
35             for(j=0;j<2*n;j+=2)
36             {
37                 if(vis[a[i][j]]==false)
38                 {
39                     vis[a[i][j]]=true;
40                     num++;
41                 }
42             }
43             ans[num]=i;
44         }
45         printf("Case #%d: %d",cas++,ans[0]);
46         for(int i=1;i<n;i++)
47             printf(" %d",ans[i]);
48         printf("\n");
49     }
50     return 0;
51 }

 

posted @ 2014-08-17 16:13  galaxy77  阅读(296)  评论(0编辑  收藏  举报