zoukankan      html  css  js  c++  java
  • 【UVA】1589 Xiangqi(挖坑待填)

    题目

    题目
     


    分析

    无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气。
    有空再写吧,最近真的快疯了。
     


    代码

    对拍

    #include <bits/stdc++.h>
    int main()
    {
    	for(int i=1;i<=100;i++){
    		system("rand.exe > in.txt");
    		system("1589.exe < in.txt > 1.txt");
    		system("std.exe < in.txt > 2.txt");
    		if(system("fc 1.txt 2.txt")){
    			printf("WA
    
    
    ");
    			system("pause");
    			break;
    		}
    		else printf("AC
    
    
    ");
    	}
    	return 0;
    }
    

    随机数

    
    #include <bits/stdc++.h>
    char s[20]="CHR";
    int a[100][100];
    bool iout(int x,int y){
    	if(x<=4&&x>=1&&y>=3&&y<=7) return false;
    	return true;
    }
    int main()
    {
    	srand(time(NULL));
    	int t=rand()%35+3;
    	while(t--){
    		memset(a,0,sizeof(a));
    		int n=rand()%5+3,x=1+rand()%3,y=4+rand()%3;
    		printf("%d %d %d
    ",n,x,y);
    		a[x][y]=1;
    		for(int i=1;i<=n-1;i++){
    			int m=rand()%3,x=rand()%10+1,y=rand()%9+1;
    			if(!a[x][y])
    			printf("%c %d %d
    ",s[m],x,y),a[x][y]=1;
    			else i--;
    		}
    	l1:	int x1=rand()%3+8,y1=rand()%3+4;
    		if(!a[x1][y1]) 
    		printf("G %d %d
    
    ",x1,y1);
    		else goto l1;
    	}
    	return 0;
    }
    

    自己的WA代码

    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    using namespace std;
    struct node{
    	int x,y;
    	char s[10];
    }a[100];
    int n,map[30][30];
    bool up,down,left,right,g;
    bool in9(int x,int y){
    	if(x>=1&&x<=3&&y>=4&&y<=6) return true;
    	return false;
    }
    bool in(int x,int y){
    	if(x>=1&&x<=10&&y>=1&&y<=9) return true;
    	return false;
    }
    int get(int x,int y){
    	if(x-1==a[0].x&&y==a[0].y) return 1;//上面
    	if(x==a[0].x&&y-1==a[0].y) return 4;//右面
    	if(x+1==a[0].x&&y==a[0].y) return 3;//下面
    	if(x==a[0].x&&y+1==a[0].y) return 2;//左面
    	return 0;
    }
    bool nothob(int x,int y,int an,int bn){
    	for(int i=1;i<=n;i++){
    		if(a[i].x==x+an && a[i].y==y+bn) return false;
    	}
    	return true;
    }
    void jump(int k)//跳马
    {
    	int x=a[k].x,y=a[k].y;
    	if(in(x+2,y+1)){
    		int m=get(x+2,y+1),p=1,q=0;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x-2,y-1)){
    		int m=get(x-2,y-1),p=-1,q=0;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}	
    	if(in(x+2,y-1)){
    		int m=get(x+2,y-1),p=1,q=0;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x-2,y+1)){
    		int m=get(x-2,y+1),p=-1,q=0;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x-1,y+2)){
    		int m=get(x-1,y+2),p=0,q=1;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x-1,y-2)){
    		int m=get(x-1,y-2),p=0,q=-1;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x+1,y+2)){
    		int m=get(x+1,y+2),p=0,q=1;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	if(in(x+1,y-2)){
    		int m=get(x+1,y-2),p=0,q=-1;
    		if(nothob(x,y,p,q)&&m){
    			if(m==1)down=false;if(m==2)left=false;
    			if(m==3)up=false;if(m==4)right=false; 
    		}
    	}
    	return;
    }
    bool empty1(int k){
    	for(int i=1;i<=n;i++){
    		if(a[i].y==a[k].y&&(a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)))
    	//	if(abs(a[i].x-a[0].x)!=1)
    		 return false;
    	}
    	return true;
    }
    bool empty2(int k){
    	for(int i=1;i<=n;i++){
    		if(a[i].x==a[k].x&&(a[i].y>min(a[0].y,a[k].y)&&(a[i].y<max(a[0].y,a[k].y)))) 
    	//	if(abs(a[i].y-a[0].y)!=1) 
    		return false;
    	}
    	return true;
    }
    void check(int k){
    	if(a[k].s[0]=='R'){	//车
    		if(a[k].y==a[0].y&&(a[k].x-a[0].x)==1&&in9(a[k].x,a[k].y)) up=false; 
    		if(a[k].x==a[0].x&&(a[k].y-a[0].y)==1&&in9(a[k].x,a[k].y)) left=false; 
    		if(a[k].y==a[0].y&&(a[k].x-a[0].x)==-1&&in9(a[k].x,a[k].y)) down=false; 
    		if(a[k].x==a[0].x&&(a[k].y-a[0].y)==-1&&in9(a[k].x,a[k].y)) right=false; 
    		if(a[k].y-a[0].y==1&&empty1(k)) right=false;//,printf("!!!!!");
    		if(a[0].y-a[k].y==1&&empty1(k)) left=false;//,printf("^^^^^");
    		if(a[k].x-a[0].x==1&&empty2(k)) down=false;
    		if(a[0].x-a[k].x==1&&empty2(k)) up=false;
    		int t1=0,t2=0,t1m=0,t2m=0;
    		for(int i=1;i<=n;i++){
    			if(a[i].x==a[k].x&&(a[i].y>min(a[0].y,a[k].y)&&(a[i].y<max(a[0].y,a[k].y)))){t1++;t1m=i;}
    			if(a[i].y==a[k].y&&(a[i].x>min(a[0].x,a[k].x)&&(a[i].x<max(a[0].x,a[k].x)))){t2++;t2m=i;}
    		}
    		if(a[k].x==a[0].x&&(t1==0)) right=false,left=false;
    		if((abs(a[t1m].y-a[0].y)==1&&t1==1)&&in9(a[t1m].x,a[t1m].y)) right=false,left=false;
    		if(a[k].y==a[0].y&&(t2==0)) up=false,down=false;
    		if(a[k].y==a[0].y&&a[t2m].x-a[0].x==1&&t2==1&&in9(a[t2m].x,a[t2m].y)) down=false;;
    		if(a[k].y==a[0].y&&a[t2m].x-a[0].x==-1&&t2==1&&in9(a[t2m].x,a[t2m].y)) up=false;
    		if(a[k].x==a[0].x&&a[t1m].y-a[0].y==1&&t1==1&&in9(a[t1m].x,a[t1m].y)) left=false;
    		if(a[k].x==a[0].x&&a[t1m].y-a[0].y==-1&&t1==1&&in9(a[t1m].x,a[t1m].y)) right=false;
    		//,printf("%d %d
    ",t2,t2m);//,printf("########");
    	//	printf("H - %d %d
    ",t2,t2m);
    	}
    	if(a[k].s[0]=='G'){	//王
    		int t1=0,t1m;
    		for(int i=1;i<=n;i++){
    			if(a[i].y==a[k].y&&a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)){t1++;t1m=i;break;}
    		}
    	//	printf("G - %d %d",t1,t1m);
    		if(a[k].y-a[0].y==1 &&t1==0) right=false;
    		if(a[0].y-a[k].y==1 &&t1==0) left=false;
    		if(a[k].y==a[0].y && t1==0) g=false,up=down=false;
    		if(t1==1&&a[k].y==a[0].y&&a[t1m].x-a[0].x==1) down=false;
    	}
    	if(a[k].s[0]=='C'){	//炮
    		if(a[k].y==a[0].y){
    			int t1=0,t2=0,t1m=0,t2m=0;
    		//	if(abs(a[k].x-a[0].x)==2) return;
    			for(int i=1;i<=n;i++){
    				if(i==k||a[i].y!=a[0].y) continue;
    				if(a[i].x>a[0].x&&a[i].x<a[k].x) t1++,t1m=i; 
    				if(a[i].x<a[0].x&&a[i].x>a[k].x) t2++,t2m=i;
    			}
    		//	printf("---------%d %d  %d %d---------
    ",t1,t1m,t2,t2m);
    			if((t1==1||(t1==2&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y)))||(t2==1||(t2==2&&abs(a[t2m].x-a[0].x)==1&&in9(a[t2m].x,a[t2m].y))))
    			if(!(t1==1&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y))||!(t2==1&&abs(a[t2m].x-a[0].x)==1&&in9(a[t2m].x,a[t2m].y)))
    			up=false,down=false;
    			if(t1==1&&abs(a[t1m].x-a[0].x)==1&&in9(a[t1m].x,a[t1m].y)) down=false;
    		}
    		if(a[k].x==a[0].x){
    		//	if(abs(a[k].y-a[0].y)==2) return;
    			int t1=0,t2=0,t1m=0,t2m=0;
    			for(int i=1;i<=n;i++){
    				if(i==k||a[i].x!=a[0].x) continue;
    				if(a[i].y>a[0].y&&a[i].y<a[k].y) t1++,t1m=i; 
    				if(a[i].y<a[0].y&&a[i].y>a[k].y) t2++,t2m=i;
    			}
    	//		printf("---------%d %d  %d %d---------
    ",t1,t1m,t2,t2m);
    			if((t1==1||(t1==2&&abs(a[t1m].y-a[0].y)==1&&in9(a[t1m].x,a[t1m].y)))||(t2==1||(t2==2&&abs(a[t2m].y-a[0].y)==1&&in9(a[t2m].x,a[t2m].y))))
    			if(!(t1==1&&abs(a[t1m].y-a[0].y)==1&&in9(a[t1m].x,a[t1m].y))||!(t2==1&&abs(a[t2m].y-a[0].y)==1&&in9(a[t2m].x,a[t2m].y)))
    			left=false,right=false;
    		}
    		if(abs(a[k].x-a[0].x)==1){
    		//	if(abs(a[k].y-a[0].y)==2) return;
    			int t1=0,t2=0;
    			for(int i=1;i<=n;i++){
    				if(i==k||a[i].x!=a[k].x) continue;
    				if(a[i].y>min(a[0].y,a[k].y)&&a[i].y<max(a[0].y,a[k].y)) t1++; 
    			}
    			if(t1==1) if(a[k].x-a[0].x==1) down=false; else up=false;
    		}
    		if(abs(a[k].y-a[0].y)==1){
    		//	if(abs(a[k].x-a[0].x)==2) return;
    			int t1=0,t2=0;
    			for(int i=1;i<=n;i++){
    				if(i==k||a[i].y!=a[k].y) continue;
    				if(a[i].x>min(a[0].x,a[k].x)&&a[i].x<max(a[0].x,a[k].x)) t1++; 
    			}
    			if(t1==1) if(a[k].y-a[0].y==1) right=false; else left=false;
    		}
    	}
    	if(a[k].s[0]=='H'){	//马 
    		jump(k);
    	}
    }
    bool init(int x,int y){
    	if(in9(x+1,y)) down=true;else down=false;
    	if(in9(x-1,y)) up=true;else up=false;
    	if(in9(x,y-1)) left=true;else left=false;
    	if(in9(x,y+1)) right=true;else right=false;
    }
    bool check2(){
    	int ax=0,x=a[0].x,y=a[0].y;
    //	printf("check2 - (%d %d)",x,y);
    	for(int i=x+1;i<=10;i++){
    		if(map[i][y]=='R') if(ax==0) return false;
    		if(map[i][y]=='C'&&ax==1) return false;
    		if(map[i][y]!=0) ax++;
    	}
    	ax=0;
    	for(int i=x-1;i>=1;i--){
    		if(map[i][y]=='R') if(ax==0) return false;
    		if(map[i][y]=='C'&&ax==1) return false;
    		if(map[i][y]!=0) ax++;
    	}
    	ax=0;
    	for(int i=y+1;i<=9;i++){
    		if(map[x][i]=='R') if(ax==0) return false;
    		if(map[x][i]=='C'&&ax==1) return false;
    		if(map[x][i]!=0) ax++;
    	}
    	ax=0;
    	for(int i=y-1;i>=1;i--){
    		if(map[x][i]=='R') if(ax==0) return false;
    		if(map[x][i]=='C'&&ax==1) return false;
    		if(map[x][i]!=0) ax++;
    	}
    	if(map[x+2][y+1]=='H'&&map[x+1][y]==0) return false;
    	if(map[x-2][y+1]=='H'&&map[x-1][y]==0) return false;
    	if(map[x+2][y-1]=='H'&&map[x+1][y]==0) return false;
    	if(map[x-2][y-1]=='H'&&map[x-1][y]==0) return false;
    	if(map[x-1][y-2]=='H'&&map[x][y-1]==0) return false;
    	if(map[x+1][y+2]=='H'&&map[x][y+1]==0) return false;
    	if(map[x-1][y+2]=='H'&&map[x][y+1]==0) return false;
    	if(map[x+1][y+2]=='H'&&map[x][y-1]==0) return false;
    	return true;
    }
    int main()
    {
    	while(scanf("%d%d%d",&n,&a[0].x,&a[0].y)==3 && n!=0){
    		init(a[0].x,a[0].y);memset(map,0,sizeof(map));
    		g=true;int mark;
    		for(int i=1;i<=n;i++){
    			scanf("%s%d%d",a[i].s,&a[i].x,&a[i].y);
    			map[a[i].x][a[i].y]=a[i].s[0];
    			if(a[i].s[0]=='G') mark=i;
    		}
    	//	printf("BEGIN--Debug: up:%d down:%d left:%d right:%d
    
    
    ",up,down,left,right);
    		for(int i=1;i<=n;i++){
    			if(!up&&!down&&!left&&!right) break;//小优化 
    	//		printf("Round:%d------------------
    ",i);
    			check(i);
    	//		printf("%d :%s (%d,%d) Debug: g:%d up:%d down:%d left:%d right:%d
    
    
    ",i,a[i].s,a[i].x,a[i].y,g,up,down,left,right);
    		}
    		a[0].x=a[mark].x;a[0].y=a[mark].y;
    		int flag=0; //if(g==false) flag=1;
    /*		if(!g&&!up&&!down&&!left&&!right){
    			printf("Debug: g:%d up:%d down:%d left:%d right:%d
    
    
    ",g,up,down,left,right);
    			g=check2();if(g==true) flag=2;
    		//	printf("Debug: g:%d up:%d down:%d left:%d right:%d
    
    
    ",g,up,down,left,right);
    		}//map[x][y]='B';*/
    	/*	for(int i=1;i<=10;i++){
    			for(int j=1;j<=9;j++) if(map[i][j]!=0) printf("%c ",map[i][j]);else printf("_ ");
    			printf("
    ");
    		}*/
    	//	printf("flag %d  g %d 
    ",flag,g);
    		if(up||down||left||right||flag==2) printf("NO
    ");
    		else printf("YES
    ");
    	}
    	return 0;
    }
    
  • 相关阅读:
    jq 的简单循环
    简单的下拉菜单
    jQ事件
    图片移动
    选中效果
    js 时间
    简单的密码验证
    DOM 的简介 和一些方法
    Java编程思想笔记
    Java并发笔记(二)
  • 原文地址:https://www.cnblogs.com/noblex/p/7858175.html
Copyright © 2011-2022 走看看