10.10T5 vector模拟+getchar卡常

军训 
(File IO): input:rect.in output:rect.out

Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits  

Description

小L正在参加学校组织的军训。军训的操场是一个n*m的网格,每个网格开始时都没有人。每次军官会指定某些行和列,并在这些行和列的每个交界处都安排站上一名学生。但为了防止两名学生站到同一个网格中,军官每次指定的行和列并不会和之前指定过的重复。军官接到了上级的要求,需要将学生摆成特定的图案,那么军官能否达成要求呢?

Input

第一行一个整数T,表示数据组数。
接下来每个数据第一行两个整数n,m,意义如题面所述。
接下来n行,每行一个长度为n的字符串,其中第j个字符是’#’则代表i行j列的网格上要有学生,如果是’.’则代表没有。

Output

对于每组数据一行一个字符串“Yes”或者”No”,表示能否达到要求。

Sample Input

1
5 8
.#.#..#.
.....#..
.#.#..#.
#.#....#
.....#..

Sample Output

Yes

Data Constraint

 n,m<=2000
 
 
 
 
 
 
vector拉行列两个表,然后行列模拟一下消除,遇到那种不存在的判No就行了
再有就是我不知道为啥被读入卡了,改getchar就过了。。。。
code:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<vector>
 4 #include<string>
 5 #define N 4000005
 6 using namespace std;
 7 int read() {
 8     int x=0,f=1;
 9     char c=getchar();
10     while(!isdigit(c)) {
11         if(c=='-')f=-1;
12         c=getchar();
13     }
14     while(isdigit(c)) {
15         x=(x<<1)+(x<<3)+c-'0';
16         c=getchar();
17     }
18     return x*f;
19 }
20 struct node {
21     int x, y;
22 } e[N];
23 int main() {
24     int T;
25     T=read();
26     while(T--) {
27         vector<int>hang[2005],lie[2005];
28         int checkhang[2003]={0},checklie[2003]={0};
29         int n,m;
30         int flag=0,cnt=0;
31         n=read(),m=read();
32         for(int i=1; i<=n; i++) {
33         /*    string kkk;
34             getline(cin,kkk);*/
35             for(int j=1; j<=m; j++) {
36                 char s=getchar();while(s!='#'&&s!='.')s=getchar();
37                 if(s=='#') {
38                     e[++cnt].x=i;
39                     e[cnt].y=j;
40                     hang[i].push_back(cnt);//在这一行,所以放进一个vector里面
41                     lie[j].push_back(cnt);//在这一列,所以放进vector里面
42                 }
43             }
44         }
45         for(int u=1; u<=cnt; u++) {
46             int i=e[u].x,j=e[u].y;
47             if(checkhang[i]||checklie[j])continue;
48             //    cout<<i<<" "<<j<<endl;
49             int temphang[2003],templie[2003];
50             int tot1=0,tot2=0;
51             for(int k=0; k<hang[i].size(); k++) { //同一行的
52                 templie[++tot2]=e[hang[i][k]].y;
53                 checklie[templie[tot2]]=1;
54             }
55             for(int k=0; k<lie[j].size(); k++) {//同一列的
56                 temphang[++tot1]=e[lie[j][k]].x;
57                 checkhang[temphang[tot1]]=1;
58             }
59             /*    for(int k=1; k<=tot1; k++) {
60                     if(flag)break;
61                     for(int l=1; l<=tot2; l++) {
62                         if(g[temphang[k]][templie[l]]=='#') {
63                             if(hang[temphang[k]].size()!=tot2)flag=1;
64                             if(lie[templie[l]].size()!=tot1)flag=1;
65                             if(flag)break;
66                             g[temphang[k]][templie[l]]='.';
67                         } else {
68                             flag=1;
69                             break;
70                         }
71                     }
72                 }*/
73             for(int k=1; k<=tot1; k++) {
74                 if(hang[temphang[k]].size()!=tot2) {
75                     flag=1;
76                     break;
77                 }
78             }
79             if(flag)break;
80             for(int l=1; l<=tot2; l++) {
81                 if(lie[templie[l]].size()!=tot1) {
82                     flag=1;
83                     break;
84                 }
85             }
86             if(flag)break;
87         }
88         if(flag)cout<<"No\n";
89         else cout<<"Yes\n";
90     }
91     return 0;
92 }

over

posted @ 2018-10-10 20:18  saionjisekai  阅读(52)  评论(0编辑  收藏  举报