NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2011國中組決賽
 A、賓果遊戲

作者 主題: A、賓果遊戲  (閱讀 6267 次)

joe59491

  • 初級會員
  • **
  • 文章數: 30
  • qazwsxedcrfvtg14
    • 檢視個人資料
A、賓果遊戲
« 於: 十二月 10, 2011, 09:52:17 pm »

超級麻煩的模擬題...比圈叉棋的程式麻煩太多了...廢話不多說了,看程式碼吧...

程式碼:
代碼: [選擇]
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int map[2][5][5];
int ar[25];
int x,y;
int see(int a,int d){
int b,c;
for(b=0;b<5;b++){
for(c=0;c<5;c++){
if(map[d][b][c]==a){x=b;y=c;return 0;}
}
}
}
int main(){
    int a,b,c,d,e,f,g,h,i,j,k,l;
    scanf("%d",&a);
    for(b=0;b<a;b++){
for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&map[0][c][d]);
}
}

for(c=0;c<5;c++){
for(d=0;d<5;d++){
scanf("%d",&map[1][c][d]);
}
}
for(c=0;c<25;c++){
scanf("%d",&ar[c]);
}g=0;
for(c=0;c<25;c++){
see(ar[c],0);
map[0][x][y]=-1;
see(ar[c],1);
map[1][x][y]=-1;


i=0;j=0;

for(d=0;d<5;d++){
if(map[0][d][0]==-1&&map[0][d][1]==-1&&map[0][d][2]==-1&&map[0][d][3]==-1&&map[0][d][4]==-1){i=1;}
if(map[0][0][d]==-1&&map[0][1][d]==-1&&map[0][2][d]==-1&&map[0][3][d]==-1&&map[0][4][d]==-1){i=1;}
}
if(map[0][0][0]==-1&&map[0][1][1]==-1&&map[0][2][2]==-1&&map[0][3][3]==-1&&map[0][4][4]==-1){i=1;}
if(map[0][0][4]==-1&&map[0][1][3]==-1&&map[0][2][2]==-1&&map[0][3][1]==-1&&map[0][4][0]==-1){i=1;}

for(d=0;d<5;d++){
if(map[1][d][0]==-1&&map[1][d][1]==-1&&map[1][d][2]==-1&&map[1][d][3]==-1&&map[1][d][4]==-1){j=1;}
if(map[1][0][d]==-1&&map[1][1][d]==-1&&map[1][2][d]==-1&&map[1][3][d]==-1&&map[1][4][d]==-1){j=1;}
}
if(map[1][0][0]==-1&&map[1][1][1]==-1&&map[1][2][2]==-1&&map[1][3][3]==-1&&map[1][4][4]==-1){j=1;}
if(map[1][0][4]==-1&&map[1][1][3]==-1&&map[1][2][2]==-1&&map[1][3][1]==-1&&map[1][4][0]==-1){j=1;}
if(i==1&&j==1){g=1;printf("0\n");break;}
if(i==1&&j==0){g=1;printf("1\n");break;}
if(i==0&&j==1){g=1;printf("2\n");break;}
}
if(g==0){printf("0\n");}

}
    return 0;
    }
記錄
(\ (\
(^_^) --by joe59491

Nineguan

  • 初級會員
  • **
  • 文章數: 43
    • 檢視個人資料
Re: A、賓果遊戲
« 回覆 #1 於: 三月 25, 2012, 03:36:37 pm »

這是我的 :P

代碼: [選擇]
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

struct data{
    int x,y;
}a1[26],a2[26];

bool s1[5][5],s2[5][5],ls1,ls2;

bool AS1()
{
    for(int i=0;i<5;i++)
        if(s1[i][0] && s1[i][1] && s1[i][2] && s1[i][3] && s1[i][4])return true;
    for(int i=0;i<5;i++)
        if(s1[0][i] && s1[1][i] && s1[2][i] && s1[3][i] && s1[4][i])return true;
    if(s1[0][0] && s1[1][1] && s1[2][2] && s1[3][3] && s1[4][4])return true;
    if(s1[4][0] && s1[3][1] && s1[2][2] && s1[1][3] && s1[0][4])return true;
    return false;
}

bool AS2()
{
    for(int i=0;i<5;i++)
        if(s2[i][0] && s2[i][1] && s2[i][2] && s2[i][3] && s2[i][4])return true;
    for(int i=0;i<5;i++)
        if(s2[0][i] && s2[1][i] && s2[2][i] && s2[3][i] && s2[4][i])return true;
    if(s2[0][0] && s2[1][1] && s2[2][2] && s2[3][3] && s2[4][4])return true;
    if(s2[4][0] && s2[3][1] && s2[2][2] && s2[1][3] && s2[0][4])return true;
    return false;
}

int main(){
    int cas,n,a,b;
    scanf("%d",&cas);
    while(cas--)
    {
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
            {
                scanf("%d",&n);
                a1[n].x=j;
                a1[n].y=i;
            }
        for(int i=0;i<5;i++)
            for(int j=0;j<5;j++)
            {
                scanf("%d",&n);
                a2[n].x=j;
                a2[n].y=i;
            }
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        for(int i=0;i<25;i++)
        {
            scanf("%d",&n);
            a=a1[n].x;
            b=a1[n].y;
            s1[a][b]=true;
            a=a2[n].x;
            b=a2[n].y;
            s2[a][b]=true;
            ls1=AS1();
            ls2=AS2();
            if(ls1 && !ls2)
            {
                printf("1\n");
                for(int j=i+1;j<25;j++)scanf("%d",&n);
                break;
            }
            else if(!ls1 && ls2)
            {
                printf("2\n");
                for(int j=i+1;j<25;j++)scanf("%d",&n);
                break;
            }
            else if(ls1 && ls2)
            {
                printf("0\n");
                for(int j=i+1;j<25;j++)scanf("%d",&n);
                break;
            }
        }
    }
    return 0;
}
記錄

skipper

  • 初級會員
  • **
  • 文章數: 28
    • 檢視個人資料
Re: A、賓果遊戲
« 回覆 #2 於: 五月 29, 2012, 09:18:41 pm »

我的版本 8)
代碼: [選擇]
#include <iostream>
using namespace std;
int prime[26] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97};
int read_array(int arr[5][5]){
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++)
cin >> arr[i][j];
}
return 0;
}

int calc_list(int arr[5][5],int list[12]){
for (int i=0;i<12;i++) list[i]=1;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
list[i]*= prime[arr[i][j]];
}
}

for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++)
list[i+5]*= prime[arr[j][i]];
}

for (int i=0;i<5;i++) list[10]*=prime[arr[i][i]];
for (int i=0;i<5;i++) list[11]*=prime[arr[i][4-i]];
return 0;
}

int divide_list(int list[12],int seed, int team){
for (int i=0;i<12;i++){
if (list[i]%prime[seed]==0)
list[i]=list[i]/prime[seed];
}
for (int i=0;i<12;i++){
if (list[i]==1){
return team;
}
}
return 0;
}
int compete(){ 
int lista[12],listb[12];
int a[5][5];
int b[5][5];
int r[25];
int winner=0;
read_array(a);
read_array(b);

for(int i = 0; i <25; i++){   
cin >> r[i];
}

calc_list(a,lista);
calc_list(b,listb);

for(int i = 0; i < 25; i++){
int flaga = divide_list(lista,r[i],1);
int flagb = divide_list(listb,r[i],2);


if (flaga==1 && flagb==0) {winner=1;break;}
if (flaga==0 && flagb==2) {winner=2;break;}
if (flaga==1 && flagb==2) {winner=0;break;}
}
return winner;
}
int main(){
int a;
int cases;
cin >> cases;
for (int i=0;i<cases;i++){
cout << compete() ;
cout << endl;
}
return 0;
}
記錄

v779n

  • 新手
  • *
  • 文章數: 3
    • 檢視個人資料
Re: A、賓果遊戲
« 回覆 #3 於: 十一月 16, 2013, 10:27:52 pm »

誰能幫我除錯一下!!
代碼: [選擇]
#include "stdio.h"
#include "stdlib.h"

int main()
{
int T,a[5][5],b[5][5],c[25],answ[3][9999];
scanf("%d",&T);
for(int i=0;i<T;i++){
for(int x=0;x<5;x++)
scanf("%d %d %d %d %d",&a[x][0],&a[x][1],&a[x][2],&a[x][3],&a[x][4]);
for(int x=0;x<5;x++)
scanf("%d %d %d %d %d",&b[x][0],&b[x][1],&b[x][2],&b[x][3],&b[x][4]);
scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",&c[0],&c[1],&c[2],&c[3],&c[4],&c[5],&c[6],&c[7],&c[8],&c[9],&c[10],&c[11],&c[12],&c[13],&c[14],&c[15],&c[16],&c[17],&c[18],&c[19],&c[20],&c[21],&c[22],&c[23],&c[24]);
for(int q=0;q<25;q++){
if(answ[2][i]==0||answ[2][i]==1||answ[2][i]==2)
break;
for(int x=0;x<5;x++){
for(int y=0;y<5;y++){
if(answ[2][i]==0||answ[2][i]==1||answ[2][i]==2)
break;
if(a[x][y]==c[q]){
a[x][y]=0;
if((a[x][0]==0&&a[x][1]==0&&a[x][2]==0&&a[x][3]==0&&a[x][4]==0)||(a[0][y]==0&&a[1][y]==0&&a[2][y]==0&&a[3][y]==0&&a[4][y]==0)){
answ[0][i]=1;
break;
}
else if((x==0&&y==0)||(x==1&&y==1)||(x==2&&y==2)||(x==3&&y==3)||(x==4&&y==4)){
if(a[0][0]==0&&a[1][1]==0&&a[2][2]==0&&a[3][3]==0&&a[4][4]==0){
answ[0][i]=1;
break;
}
}
else if((x==0&&y==4)||(x==1&&y==3)||(x==2&&y==2)||(x==3&&y==1)||(x==4&&y==0)){
if(a[0][4]==0&&a[1][3]==0&&a[2][2]==0&&a[3][1]==0&&a[4][0]==0){
answ[0][i]=1;
break;
}
}
}
if(b[x][y]==c[q]){
b[x][y]=0;
if((b[x][0]==0&&b[x][1]==0&&b[x][2]==0&&b[x][3]==0&&b[x][4]==0)||(b[0][y]==0&&b[1][y]==0&&b[2][y]==0&&b[3][y]==0&&b[4][y]==0)){
answ[1][i]=2;
break;
}
else if((x==0&&y==0)||(x==1&&y==1)||(x==2&&y==2)||(x==3&&y==3)||(x==4&&y==4)){
if(b[0][0]==0&&b[1][1]==0&&b[2][2]==0&&b[3][3]==0&&b[4][4]==0){
answ[1][i]=2;
break;
}
}
else if((x==0&&y==4)||(x==1&&y==3)||(x==2&&y==2)||(x==3&&y==1)||(x==4&&y==0)){
if(b[0][4]==0&&b[1][3]==0&&b[2][2]==0&&b[3][1]==0&&b[4][0]==0){
answ[1][i]=2;
break;
}
}
}
if(answ[0][i]==1&&answ[1][i]==2){
answ[2][i]=0;
break;
}
else if(answ[0][i]==1){
answ[2][i]=1;
break;
}
else if(answ[1][i]==2){
answ[2][i]=2;
break;
}
}
}
}
}
for(int i=0;i<T;i++){
if(answ[2][i]==NULL)
answ[2][i]=0;
printf("%d\n",answ[2][i]);
}
   // system("PAUSE");
    return 0;
}
« 上次編輯: 十一月 16, 2013, 10:48:41 pm 由 v779n »
記錄

darry140

  • 初級會員
  • **
  • 文章數: 32
    • 檢視個人資料
Re: A、賓果遊戲
« 回覆 #4 於: 十一月 22, 2013, 12:56:02 am »

誰能幫我除錯一下!!
代碼: [選擇]
恕刪...
代碼: [選擇]
#include "stdio.h"
#include "stdlib.h"

int main()
{
int T,a[5][5],b[5][5],c[25],answ[3][9999];
scanf("%d",&T);
for(int k=0;k<9999;k++)
answ[0][k]=answ[1][k]=answ[2][k]=-1;
for(int i=0;i<T;i++){
for(int x=0;x<5;x++)
scanf("%d %d %d %d %d",&a[x][0],&a[x][1],&a[x][2],&a[x][3],&a[x][4]);
for(int x=0;x<5;x++)
scanf("%d %d %d %d %d",&b[x][0],&b[x][1],&b[x][2],&b[x][3],&b[x][4]);
scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",&c[0],&c[1],&c[2],&c[3],&c[4],&c[5],&c[6],&c[7],&c[8],&c[9],&c[10],&c[11],&c[12],&c[13],&c[14],&c[15],&c[16],&c[17],&c[18],&c[19],&c[20],&c[21],&c[22],&c[23],&c[24]);
for(int q=0;q<25;q++){
if(answ[2][i]==0||answ[2][i]==1||answ[2][i]==2)
break;
for(int x=0;x<5;x++){
for(int y=0;y<5;y++){
if(answ[2][i]==0||answ[2][i]==1||answ[2][i]==2)
break;
if(a[x][y]==c[q]){
a[x][y]=0;
if((a[x][0]==0&&a[x][1]==0&&a[x][2]==0&&a[x][3]==0&&a[x][4]==0)||(a[0][y]==0&&a[1][y]==0&&a[2][y]==0&&a[3][y]==0&&a[4][y]==0)){
answ[0][i]=1;
//break;
}
else if((x==0&&y==0)||(x==1&&y==1)||(x==2&&y==2)||(x==3&&y==3)||(x==4&&y==4)){
if(a[0][0]==0&&a[1][1]==0&&a[2][2]==0&&a[3][3]==0&&a[4][4]==0){
answ[0][i]=1;
//break;
}
}
else if((x==0&&y==4)||(x==1&&y==3)||(x==2&&y==2)||(x==3&&y==1)||(x==4&&y==0)){
if(a[0][4]==0&&a[1][3]==0&&a[2][2]==0&&a[3][1]==0&&a[4][0]==0){
answ[0][i]=1;
//break;
}
}
}
if(b[x][y]==c[q]){
b[x][y]=0;
if((b[x][0]==0&&b[x][1]==0&&b[x][2]==0&&b[x][3]==0&&b[x][4]==0)||(b[0][y]==0&&b[1][y]==0&&b[2][y]==0&&b[3][y]==0&&b[4][y]==0)){
answ[1][i]=2;
//break;
}
else if((x==0&&y==0)||(x==1&&y==1)||(x==2&&y==2)||(x==3&&y==3)||(x==4&&y==4)){
if(b[0][0]==0&&b[1][1]==0&&b[2][2]==0&&b[3][3]==0&&b[4][4]==0){
answ[1][i]=2;
//break;
}
}
else if((x==0&&y==4)||(x==1&&y==3)||(x==2&&y==2)||(x==3&&y==1)||(x==4&&y==0)){
if(b[0][4]==0&&b[1][3]==0&&b[2][2]==0&&b[3][1]==0&&b[4][0]==0){
answ[1][i]=2;
//break;
}
}
}
}
}
if(answ[0][i]==1&&answ[1][i]==2){
answ[2][i]=0;
break;
}
else if(answ[0][i]==1){
answ[2][i]=1;
break;
}
else if(answ[1][i]==2){
answ[2][i]=2;
break;
}
}
}
//for(int i=0;i<T;i++){
// if(answ[2][i]==NULL)
// answ[2][i]=0;
for(int k=0;k<T;k++)
printf("%d\n",answ[2][k]);
   // system("PAUSE");
    return 0;
}
幾個地方... 改掉就有AC了
1.
   個人不擅長NULL什麼的 所以直接初始化成-1
2.
   不能一偵測到連線就break掉
   你的寫法如果偵測到第一張卡片的連線
   就會break 就不會去偵測第二張卡片了
3.
   判斷勝負的if else放錯地方
   應該是要等兩張卡片偵測連線都完成之後再判斷勝負
   所以放在偵測連線的for迴圈外面
« 上次編輯: 十一月 22, 2013, 12:59:54 am 由 darry140 »
記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2011國中組決賽
 A、賓果遊戲